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;
}