Codeforces-68B Energy exchange
题目 :Codeforces-68B题意:二分,求最大的平均值;因为让每一个容器里的能量都相同必须转移,转移的过程中就会有损耗,所以均值不定;只要多出来的能量等于损耗的,就是最好的情况,即sum-n*mid==k*sum2/100。
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<algorithm>
using namespace std;
#define N 100005
int main(){
double k,a[N];
int n;
double sum=0;
cin>>n>>k;
for(int i=0;i<n;i++){
scanf("%lf",&a[i]);
sum+=a[i];
}
sort(a,a+n);
double l=a[0],r=a[n-1],mid;
while(l+1e-8<=r){
mid=(l+r)/2;
double sum2=0;
for(int i=0;i<n;i++){
if(a[i]>mid){
sum2+=a[i]-mid;
}
}
if((sum-n*mid)==(k*sum2)/100){
printf("%.7lf\n",mid);
return 0;
}
if((sum-n*mid)>k*sum2/100){
l=mid;
}
else{
r=mid;
}
}
printf("%.7lf\n",r);
return 0;
}