CodeForces - 68B




http://codeforces.com/problemset/problem/68/B





題目大意:

有n個蓄電池  每個蓄電池內有初始電量   現在要通過蓄電池之間電量相互轉移的方法使每個蓄電池內的電量   電量轉移有損失  每轉移x電量   損失%k   問怎樣轉移使最後蓄電池內電量最多輸出最多電量



分析:

沒找到貪心的方法直接暴力二分了   二分枚舉最後的電量  看能不能通過轉移達到這個電量  蓄電池電量高於mid的減去mid減去損失後給小於mid的蓄電池  最後結果應該爲0





AC代碼:

#include<bits/stdc++.h>
using namespace std;
double a[1000005];
int main (){
    int n,k;
    while (scanf ("%d%d",&n,&k)!=EOF){
        for (int i=0;i<n;i++) scanf ("%lf",&a[i]);
        sort(a,a+n);
        double l=a[0],r=a[n-1];
        double mid=(l+r)/2.0;
        while (r-l>=1e-6){
            double sum=0;
            for (int i=0;i<n;i++)
                if(a[i]>mid) sum+=(a[i]-mid)-(a[i]-mid)*k/100.0;
                else sum-=mid-a[i];
            if (sum<-1e-7) r=mid;
            else if (sum>1e-7) l=mid;
            else break;
            mid=(l+r)/2.0;
        }
        printf ("%.9lf\n",mid);
    }
}


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