【题目大意】:给n个二元组,叫你从中去掉k个,使得sigema(100*a[i]-b[i])最大
【解题思路】:我们不妨令ans=sigema(100*a[i]-b[i])...得到sigema(a[i])*100-sigema(b[i])*ans=0;
然后...接下就是二分...求max就可以了...
【代码】:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
#include <queue>
#include <cmath>
#include <string>
#include <cctype>
#include <map>
#include <iomanip>
using namespace std;
#define eps 1e-8
#define pi acos(-1.0)
#define inf 1<<30
#define linf 1LL<<60
#define pb push_back
#define lc(x) (x << 1)
#define rc(x) (x << 1 | 1)
#define lowbit(x) (x & (-x))
#define ll long long
double a[1100],b[1100],tmp[1100];
int n,k;
double summ;
bool cmp(const double &a,const double &b){
return a>b;
}
bool check(double mid){
for (int i=0; i<n; i++) tmp[i]=a[i]*100-b[i]*mid;
sort(tmp,tmp+n,cmp);
double summ=0.0;
for (int i=0; i<n-k; i++) summ+=tmp[i];
if (summ>0) return true;
else return false;
}
double solve(){
double low=0,high=100,mid;
while (low+eps<high){
mid=(low+high)/2.0;
if (check(mid)) low=mid;
else high=mid;
}
return mid;
}
int main() {
while (~scanf("%d%d",&n,&k)){
if (n==0 && k==0) break;
for (int i=0; i<n; i++) scanf("%lf",&a[i]);
for (int i=0; i<n; i++) scanf("%lf",&b[i]);
printf("%.0f\n",solve());
}
return 0;
}