题解 SP11814 【EKO - Eko】

引领天下

2019-07-28 21:00:03

Solution

康了一下题解相当不详细啊…… 这个题是裸的二分答案 直接用代码讲吧 ```cpp #include <bits/stdc++.h> using namespace std; int n,m;//n->N,m->M long long a[1000005],ans;//注意!每个数≤1000000000,会爆int(所以我们其实可以hack掉@炸毛的龙猫 的题解) inline bool check(long long d){ long long cnt=0; for (int i=1;i<=n;i++)cnt+=max(a[i]-d,(long long)0); return cnt>=m; } int main(){ scanf("%d%d",&n,&m); long long l=1,r=0,mid;//敲黑板:三年OI一场空,不开long long见祖宗 for (int i=1;i<=n;i++)scanf("%lld",&a[i]),r=max(r,a[i]);//很明显下界是1,上界我们定一个最大值 while(l<=r){//有可能的区间 mid=(l+r)>>1; if (check(mid))ans=max(ans,mid),l=mid+1;//mid是一个可行的答案,那么可能的区间上调,同时更新答案 else r=mid-1;//否则可能的区间下调 } printf("%lld",ans); } ```