挂个链接CodeForces
题目大意:给你(n)个长椅,每张长椅上面有(a_i)个人,现在有m个人来了,求让着m个人坐上去后长椅上的人的最大数和最小数**
分析:
本题的要求为最大化最大值和最小化最大值,所以看到第二个我们考虑二分答案。
#include<stdio.h>#include<stdlib.h>#include<string.h>#include<math.h>#include<iostream>#include<queue>#include<algorithm>#define ll long long#define re registerusing namespace std;inline int gi(){ int sum=0,f=1;char ch=getchar(); while(ch>'9' || ch<'0'){if(ch=='-')f=-1;ch=getchar();} while(ch>='0' && ch<='9'){sum=(sum<<3)+(sum<<1)+ch-'0';ch=getchar();} return f*sum;}inline ll gl(){ ll sum=0,f=1;char ch=getchar(); while(ch>'9' || ch<'0'){if(ch=='-')f=-1;ch=getchar();} while(ch>='0' && ch<='9'){sum=(sum<<3)+(sum<<1)+ch-'0';ch=getchar();} return f*sum;}int n,m,a[1010],Min=2e9,Max=0;bool check(int mid){ int sum=0; for(re int i=1;i<=n;i++){ if(a[i]>mid)return false; sum+=mid-a[i]; } return sum>=m;}int main(){ n=gi();m=gi(); for(re int i=1;i<=n;i++){ a[i]=gi();Min=min(Min,a[i]);Max=max(Max,a[i]); } int l=Min,r=Max+m,ans; while(l<=r){ int mid=(l+r)>>1; if(check(mid)){ans=mid;r=mid-1;} else l=mid+1; } printf("%d %dn",ans,Max+m); return 0;}转载于:https://www.cnblogs.com/cjgjh/p/9769464.html