POJ 2976 Dropping tests(二分答案)
【题目链接】 http://poj.org/problem?id=2976
【题目大意】
给出每门成绩的总分和得分,去除k门成绩之后
使得剩余的成绩分数和除以总分得到的数字最大,要求精度在三位小数之内四舍五入到整数
【题解】
如果答案是x,那么必有选取的几门课程sigma(a*100)>=sigma(b*x)
至于选取,就可以根据a*100-b*x排序,贪心选取即可。
对于最后的精度处理问题,只要将数据放大处理末尾即可。
【代码】
#include <cstdio> #include <algorithm> using namespace std; const int N=1010; struct data{long long a,b;}p[N]; int n,m,k; bool cmp(data a,data b){return a.a*1000000-a.b*m>b.a*1000000-b.b*m;} bool check(int x){ m=x; sort(p+1,p+n+1,cmp); long long cnt=0; for(int i=1;i<=k;i++)cnt+=p[i].a*1000000-p[i].b*x; return cnt>=0; } int main(){ while(~scanf("%d%d",&n,&k),n+k){ k=n-k; for(int i=1;i<=n;i++)scanf("%lld",&p[i].a); for(int i=1;i<=n;i++)scanf("%lld",&p[i].b); int l=0,r=1000000,ans; while(l<=r){ int mid=(l+r)>>1; if(check(mid))l=mid+1,ans=mid; else r=mid-1; }printf("%d\n",ans/10000+(ans%10000>=5000)); }return 0; }
愿你出走半生,归来仍是少年