题目大意
给出n个 ai ,bi对 最多删去其中k对 使得 Σai/Σ bi 最大
题目分析
考虑二分。因为解的存在具有单调性。
所以二分答案
把小于0的结果放在优先队列里面,如果个数大于k 就弹出最大的k个即可
代码详解
#include <bits/stdc++.h>
#define eps 1e-6
using namespace std;
typedef long long ll;
const int maxn =1030;
ll a[maxn],b[maxn];
int n,k;
int dcmp(double x)
{
if(fabs(x)<eps) return 0;
else return x>0?1:-1;
}
bool check(double mid)
{
//cout<<mid<<endl;
priority_queue<double> pq;
double ans = 0;
for(int i=1;i<=n;i++)
{
// cout<<a[i]<<" "<<b[i]<<endl;
double tmp = a[i]*1.0 - mid*b[i]*1.0;
//cout<<"i = "<<i<<" tmp= "<<tmp<<endl;
if(dcmp(tmp)>=0) ans +=tmp;
else pq.push(tmp);
}
int sz = pq.size();
while(sz>k)
{
//cout<<pq.top()<<" "<<endl;
ans += pq.top();
pq.pop();
sz--;
}
if(dcmp(ans)>=0) return true;
else return false;
}
int main()
{
while(scanf("%d%d",&n,&k))
{
if(n==0&&k==0) break;
for(int i=1;i<=n;i++)
{
scanf("%lld",&a[i]);
}
for(int i=1;i<=n;i++) scanf("%lld",&b[i]);
double l = 0,r=1;
while(fabs(r-l)>eps)
{
double mid = (l+r)/2;
if(check(mid)) l = mid;
else r= mid;
}
printf("%.0f\n",l*100);
}
return 0;
}