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;
}
愿你出走半生,归来仍是少年

浙公网安备 33010602011771号