LG-P1873 砍樹(二分)
阿新 • • 發佈:2018-12-07
改成longlong就過了
這題是找最大的,最初寫成找最小的了,也就是r當答案了
AC Code
#include<bits/stdc++.h> using namespace std; typedef long long ll; const int maxn = 1e6+10; const int INF = 0x3f3f3f3f; ll t[maxn],n,m; bool solve(int mid) { ll sum =0; for(int i=0; i<n; i++) { if(t[i] > mid) sum+=(t[i] - mid); } return sum>=m; } int main() { ll mmax=0; cin>>n>>m; for(int i=0; i<n; i++) { cin>>t[i]; mmax = max(mmax,t[i]); } ll l=0,r=mmax,mid,ans = 0; while(l<=r) { mid = (r+l)/2; if(!solve(mid)) r = mid-1; else l = mid+1 ; } cout<<l-1<<endl; return 0; }
Other
sort(h+1,h+n+1);
l=0;
r=h[n];
while (l+1<r)
{
ll maxn=0;
mid=(l+r)/2;
for (int i=1;i<=n;i++)
if (h[i]>mid) maxn=maxn+h[i]-mid;
if (maxn<m) r=mid;
else l=mid;
}
printf("%lld",l);