Constraints
Time Limit: 10 secs, Memory Limit: 32 MB
Description
歌手The Pancakes到幼儿园跟小朋友玩耍,她到达的时候小朋友们已经争着积木玩了。小朋友都想要更多的积木砌一个自己喜欢的图形,砌完就可以和The Pancakes合照。同时,The Pancakes手上还有一些积木,她可以把手上的这些积木全部给一个小朋友,然后等该小朋友砌完后就可以收回所发的积木和该小朋友原先手上的积木。但她不知道能否让所有的小朋友都和她合照,聪明的你可以帮助她吗?
Input
输入包含多个数据。
每个数据的第一行是两个正整数n和s,1≤n≤10000,1≤s≤1000000,表示一共有n位小朋友,The Pancakes手上有s块积木。以下有n行,每行有两个正整数,a和b,1≤a,b≤10^9,表示第i个小朋友手上有a块积木,还需要b块积木才能够砌完。
输入n=0时表示结束。
Output
如果可以让所有小朋友都和Pancake合照,就输出YES;否则,输出NO。
解题思路:将手中的积木优先给所需积木最少的小朋友。使用vector< pair<int, int> >来存储当前小朋友手中积木数和所需积木数,对所需积木数进行排序
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
typedef pair<int, int> PAIR;
bool cmppair(const PAIR &a, const PAIR &b){
return a.second < b.second;
}
int main(int argc, const char * argv[]) {
// insert code here...
while (1) {
int s,n;
bool result = true;
vector< pair<int, int> > children; // children用于存储小朋友手中积木数和所需积木数
cin >> n >> s;
if (n == 0) break;
for (int i = 0; i < n; i++) {
int a,b;
cin >> a >> b;
children.push_back(make_pair(a, b));
}
sort(children.begin(), children.end(), cmppair); // 按照小朋友手中所需积木数进行排序,从小到大
for (int i = 0; i < children.size(); i++) {
if (s >= children[i].second) {
s+= children[i].first ; // 满足当前小朋友手中积木数后,将小朋友所有的积木回收
}
else{
result = false;
break;
}
}
if (result) cout << "YES" << endl;
else cout << "NO" << endl;
}
return 0;
}