首页 > 编程知识 正文

二分答案算法,a卷的答案二年级

时间:2023-05-05 03:07:37 阅读:232740 作者:1841

原题

挂个链接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

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。