USACO silver P1

原题概述题意:

共有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\n",ans);
    fclose(stdin);
    fclose(stdout);
}

 

posted @ 2017-06-01 16:06  ghostfly233  阅读(194)  评论(0)    收藏  举报