1 #include<cstdio> 2 #include<iostream> 3 using namespace std; 4 int l,r,m,n,a[60],ans; 5 bool pan(int x) 6 { 7 int a1=min(x,m); 8 for(int i=1;i<=n;i++) 9 if(a[i]<x) 10 { 11 a1-=x-a[i]; 12 if(a1<0) 13 return 0; 14 } 15 return 1; 16 } 17 int main() 18 { 19 scanf("%d%d",&n,&m); 20 for(int i=1;i<=n;i++) 21 scanf("%d",&a[i]); 22 l=0; 23 r=1000000000; 24 for(;l<=r;) 25 { 26 int mid=(l+r)>>1; 27 if(pan(mid)) 28 { 29 l=mid+1; 30 ans=mid; 31 } 32 else 33 r=mid-1; 34 } 35 printf("%d ",ans); 36 return 0; 37 }
二分答案判断是否可行。
其实我还有一种想法,只是一直没对,以后要对拍一下。
1 #include<cstdio> 2 #include<iostream> 3 #include<algorithm> 4 using namespace std; 5 long long a[1000000],n,m,sum,q1=0x7ffffffffLL,q2=0x7ffffffffLL; 6 bool f; 7 int main() 8 { 9 scanf("%lld%lld",&n,&m); 10 for(int i=1;i<=n;i++) 11 scanf("%lld",&a[i]); 12 sort(a+1,a+n+1); 13 for(int i=2;i<=n;i++) 14 { 15 if(m-(i-1)*(a[i]-a[i-1])<0) 16 { 17 f=1; 18 q1=m/(i-1)+a[i-1]; 19 } 20 m-=(i-1)*(a[i]-a[i-1]); 21 if(sum+(i-1)*(a[i]-a[i-1])>a[i]) 22 { 23 f=1; 24 q2=(sum-(i-1)*a[i-1])/(2-i); 25 } 26 if(f) 27 break; 28 sum+=(i-1)*(a[i]-a[i-1]); 29 } 30 printf("%lld",min(a[n],min(q1,q2))); 31 return 0; 32 }