/* 题意:给定n个实数l[i],给定一个k 问:求最大的ans,使得sum l[i]/ans i=1 to n >=k,且ans最大 */ #include#include #include #define range(i,a,b) for (int i=a;i<=b;i++)using namespace std;const int maxn = 10000;int n,k;double l[maxn+1];double max(double a,double b){ return a>b ? a : b;}bool check(double val){ int ans(0); range(i,1,n) ans += (int)(l[i]/val); return ans>=k;}int main(){ double left(0),right(0);//假如这两个定义到全局,则会显示reference to right is ambiguous //注意初始化,left本来是初始化为1的,但是这样是错的因为可能存在小于1的答案 cin>>n>>k; range(i,1,n) { scanf("%lf",&l[i]); right = max(right,l[i]); } range(c,1,1000) { double mid = (left+right)/2; if (check(mid)) { left = mid; } else { right = mid; } } printf("%.2f\n",floor(right*100)/100); return 0; //WA}
进行100次循环,每次二分,精度为lenmax>>100。
本例中N=10000,所以大概为1*e-27左右吧。