POJ 2976 Dropping tests (最大化平均值)
题目链接:click here~~
【题目大意】给你n个分数的值,要求最小不选k个,使得最后分数相加结果平均值最大
【解题思路】:最大化平均值:參见:click here~~
代码:
#include <stdio.h> #include <math.h> #include <string.h> #include <iostream> #include <algorithm> using namespace std; const int N=1e5+10; const double eps=1e-8; double y[N],v[N],w[N]; int n,k,m; bool get(double mid)//能够选择使得单个分数的值不小于mid { bool pk; for(int i=0; i<n; i++) y[i]=v[i]-mid*w[i]; sort(y,y+n); //从大到小排序 double sum=0; for(int i=0; i<n-k; i++) sum+=y[n-i-1];//从大往小选择 if(sum>=0) pk=true; else pk=false; return pk; } int main() { //freopen("1.txt","r",stdin); while(scanf("%d%d",&n,&k)!=EOF) { if(n==0&&k==0) break; for(int i=0; i<n; i++) scanf("%lf",&v[i]); for(int i=0; i<n; i++) scanf("%lf",&w[i]); double ll=0,rr=1e10; while(fabs(ll-rr)>eps){ double mid=(ll+rr)/2; if(get(mid)) ll=mid; else rr=mid; } printf("%.0f\n",rr*100); } return 0; }