当前位置: 首页 > 工具软件 > openoj > 使用案例 >

openoj的一个小比赛(B题解题报告)

司徒宏远
2023-12-01

第一题:http://openoj.awaysoft.com:8080/judge/contest/view.action?cid=47#problem/B

就是一个贪心,才开始我是买饭时间从小到大排序做,结果贡献了好几次wa无语啊。。最后自己yy了一会发现应该是按吃饭时间从大到小排序,因为吃饭时间最长的先买饭吃饭这样后面的人在他吃饭的时候就可以把买饭与吃饭的事情就做完了。贪心很弱啊。

#include <cstdio>
#include <iostream>
#include <iostream>
#include <algorithm>
using namespace std;
const int max_s = 1007;
struct node
{
    int x,y;
}p[max_s];
int cmp(const node a,const node b)
{
    if(a.y!=b.y)
    return a.y>b.y;
    else
    return a.x<b.x;
}
int main()
{
    //freopen("d.txt","r",stdin);
    int n,i;
    while(scanf("%d",&n),n)
    {
        for(i=0;i<n;i++)
        scanf("%d%d",&p[i].x,&p[i].y);
        sort(p,p+n,cmp);//排序
       /* for(i=0;i<n;i++)
        printf("%d %d\n",p[i].x,p[i].y);*/
        int m=p[0].x+p[0].y;
        int op=p[0].x;
        for(i=1;i<n;i++)
        {
            //printf(">>%d %d\n",i,op);
            if(m<p[i].x+p[i].y+op)
            m=p[i].x+p[i].y+op;//下一个人要加上在他之前所有人的总共排队时间。。
            //这里是关键,应为只有一个窗口
            op+=p[i].x;
        }
        printf("%d\n",m);
    }
    return 0;
}

  



 类似资料: