CF1203 兼第五次训练赛(G)

CF 1203 Complete the Projects (easy version)
题意:
给n组数据和一个初始值,每个任务都有分数到达要求才能进行,完成一个任务相应的加减分数,并且要求不论何时该分数不能小于0,求是否能够完成所有任务。
思路:
先利用贪心,把所有加分为正的任务从小到大完成,若有无法完成的任务,则输出NO,再将加分为负的按照完成该任务所需门槛与所加分的和,从大到小进行排序,依次判断任务是否可以完成,若有无法完成(总分<0或剩余分数不够当前任务所需分数),输出NO,若所有任务均完成,输出YES。

#include <iostream>
#include <algorithm>
using namespace std;
struct s
{
    int a,b;
};
bool cmp(struct s x,struct s y)
{
    return x.a<y.a;
}
bool cmp1(struct s x,struct s y)
{
    return x.a+x.b>y.a+y.b;
}
int main()
{
    struct s m[101];
    int n,s,i;
    cin>>n>>s;
    for(i=0; i<n; i++)
    {
        cin>>m[i].a>>m[i].b;
    }
    sort(m,m+n,cmp);
    for(i=0; i<n; i++)//利用贪心思想将所有b>0的先完成
    {
        if(m[i].b>0)
        {
            if(m[i].a<=s)
                s+=m[i].b;
            else//如果有无法完成的任务,退出。
                break;
        }
    }
    if(i!=n)
        cout<<"NO"<<endl;
    else
    {
        sort(m,m+n,cmp1);
        for(i=0; i<n; i++)//按照a+b从大到小排序
        {
            if(m[i].b<=0)
            {
                if(s<m[i].a)//达不到该任务所需分数的门槛
                    break;
                s+=m[i].b;
            }
            if(s<0)如果总分低于0,失败。
                break;
        }
        if(i!=n)
            cout<<"NO"<<endl;
        else
            cout<<"YES"<<endl;
    }
    return 0;
}
Cu1
发布了30 篇原创文章 · 获赞 2 · 访问量 970

猜你喜欢

转载自blog.csdn.net/CUCUC1/article/details/104465603