题目大意就是给你一堆A[i]和B[i]问你去掉那K组可以使sigmaAset / sigmaBset最大
很明显变形一下后就能很好知道题目是求
(A[i] + …. A[i+x]) = (B[i] + …. B[i+x])* mid
使mid最大,输出mid*100就行了
代码
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#define LL __int64
using namespace std;
const int maxn = 1010;
int a[maxn],b[maxn];
double c[maxn];
int n,k;
bool check(double mid)//这里我之前用int做了一次,后来发现精度问题还是double
{
double cnt = 0;
for(int i=0;i<n;i++){
c[i] = (double)a[i] - (double)b[i]*mid;//注意精度
}
sort(c,c+n);
for(int i=k;i<n;i++) cnt+=c[i];
//printf("%g %g\n",cnt,mid);
if(cnt >= 0) return true;
else return false;
}
int main()
{
while(~scanf("%d%d",&n,&k) && (n+k)){
for(int i=0;i<n;i++) scanf("%d",&a[i]);
for(int i=0;i<n;i++) scanf("%d",&b[i]);
double l = 0.0 , r = 1.0;
double ans = 0.0;
while(abs(r-l) >= 0.00001){
double mid = (l+r)/2.0;
if(check(mid)){
l = mid ;
ans = mid;
}else r = mid ;
//printf("l:%d r:%d ans : %d\n",l,r,ans);
}
printf("%.0f\n",ans*100.0);
}
return 0;
}
加油~