原题概述题意:
共有N个数,每个数的个数为ai,ai的总和为M,将每2个数进行配对,要求使配对之后2数的和的最大值最小,并输出最小值。
这不就是裸的贪心么。。实在是水题啊,
不过如果假如有一个人要一个一个去配对那是会T的,因为给出的数列没有排序,所以绝对不行。
每一次取第一个数和最后一个数的个数的最小值,如果个数为0,则指针向中间缩,并不断更新答案即可。
下面贴代码
#include<cstdio> #include<algorithm> #define inf 0x3f3f3f3f #define max(a,b) (a)<(b)?(b):(a) using namespace std; struct nn{ int tt,num; }qaq[100005]; bool cmp(nn a,nn b){return a.num<b.num;} int ans=0,n; int main(){ freopen(".in","r",stdin); freopen(".out","w",stdout); scanf("%d",&n); for(int i=1;i<=n;i++) { int x,y; scanf("%d%d",&x,&y); qaq[i].num=y; qaq[i].tt=x; } sort(qaq+1,qaq+n+1,cmp); int l=1,r=n; while(l<=r) { int tmp=min(qaq[l].tt,qaq[r].tt); qaq[l].tt-=tmp; qaq[r].tt-=tmp; ans=max(ans,qaq[l].num+qaq[r].num); if(qaq[l].tt<=0)l++; if(qaq[r].tt<=0)r--; } printf("%d ",ans); fclose(stdin); fclose(stdout); }