。。。。。。。。
。。。。。。。。
深感佩服。
对每个位置,每加一头奶牛的偏移量是a[i]/(c*(c+1))。
然后二分所有位置的最小值,对每个位置解出c,如果所有c的和<=k那么允许更新答案。
你说不对?
出题人告诉你答案四舍五入。。本来一个不是很对的算法就这么过掉了。
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<cmath> #define maxn 100050 #define eps 1e-13 using namespace std; long long n,k,a[maxn],mx=0; double l,r,mid,ans=0; bool check(double x) { long long ret=0; for (long long i=1;i<=n;i++) { double c=(sqrt(1+(double)4*a[i]/x)-1)/2+1; ret+=(long long)c; } return ret<=k; } int main() { scanf("%lld%lld",&n,&k); for (long long i=1;i<=n;i++) { scanf("%lld",&a[i]); mx=max(mx,a[i]); } l=0;r=mx; while (r-l>eps) { mid=(l+r)/2; if (check(mid)) r=mid; else l=mid; } if (check(l)) { for (long long i=1;i<=n;i++) { long long c=(long long)(sqrt(1+(double)4*a[i]/l)-1)/2; ans+=(double)a[i]/c; } } else { for (long long i=1;i<=n;i++) { long long c=(long long)(sqrt(1+(double)4*a[i]/r)-1)/2+1; ans+=(double)a[i]/c; } } printf("%.0lf ",ans); return 0; }