題目大意就是給你一堆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;
}
加油~