POJ 2976 Dropping tests (經典變形二分)

傳送門

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

加油~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章