题目描述
Kirito现在被困在一个MMORPG游戏当中,为了离开这个游戏,他现在必须和 条龙进行战斗,Kirito和这 头龙都有一个力量值,用整数表示,Kirito最初的力量值为 。如果在Kirito和第 头龙 的对决当中,Kirito的力量不大于龙的力量 ,那么,Kirito将输掉对决并死亡。如果Kirito的力量大于龙的力量,那么,Kirito将打败这条龙并且升级获得额外的力量提升。
现在,Kirito可以按照任意顺序和这些龙进行决斗,请问,Kirito能否离开这个游戏,即Kirito能够战胜所有的 头龙并且没有死亡。
输入格式
题目包含 !多组 ! 输入
第一行输入两个数字 和 ,表示Kirito的初始力量值和龙的数量。
接下来 行,每行输入两个数字 和 。表示第 条龙的力量以及Kirito击败这头龙能够获得的额外力量值。
输出格式
如果Kirito能够离开这个游戏,则输出””, 否则,则输出””.
样例
样例输入
2 2
1 99
100 0
样例输出
YES
分析
这一题是一道非常简单的贪心题。
我们将龙从小到大按顺序排列,这样可以打败尽可能多的龙,从而积累更多的战斗力。
最佳贪心策略就是比较 ,最小的最先做,从而积累 。
#include<cstdio>
#include<algorithm>
#include<cstring>using namespace std;const int MAXN = 10005;struct node{int xi, yi;
}a[MAXN]; //结构体bool cmp(node x, node y){return x.xi < y.xi;
} //先找战斗力小的龙int main(){int s, n;while(scanf("%d %d",&s,&n) != EOF){ // 多组数据,无限输入for(int i=1; i<=n; i++){scanf("%d%d", &a[i].xi, &a[i].yi);}sort(a+1, a+1+n, cmp);bool flag = false;for(int i=1; i<=n; i++){if(s > a[i].xi){ // 赢了s += a[i].yi; // 加能量}else{ // 输了flag = true;break;}}if(flag == true)printf("NO\n");else{printf("YES\n");}}return 0;
}