【贪心算法】合照

Description
歌手SJM到幼儿园跟小朋友玩,他到达的时候小朋友已经争着积木玩了。小朋友都想要更多的积木砌一个自己喜欢的图形,砌玩就可以和SJM合照。同时,SJM手上还有一些积木,他可以把手里的这些积木全部给一个小朋友,然后等该小朋友砌完后就可以收回所发的积木和该小朋友原先手里的积木。但SJM想知道他最多可以和多少个小朋友合照,你能帮助他吗?
Input
输入第一行包括两个正整数N和S,中间用空格隔开,其中1<=N<=1000,1<=S<=10000,表示一共有N位小朋友, SJM手上有S块积木。以下有N行,每行有两个正整数,a和b(1<=a<=10^5,1<=b<=10^9),表示每个小朋友手上有的积木数量和还需要的积木数量。

Output
输出SJM最多可以和多少个小朋友合照。

Sample Input
输入样例1:
2 2
1 4
2 1
输入样例2:
2 2
1 4
1 1
Sample Output
输出样例1:
2
输出样例2:
1
HINT
样例解释:

样例1:有2个小朋友,SJM手里一开始有2块积木,第1个小朋友手里有1块积木,他还需要4块积木,第2个小朋友手里有2块积木,他还需要1块积木,SJM可以先满足第2个小朋友的需求,即给第2个小朋友1块积木,这样第2个小朋友就可以砌完图形,然后把所有的积木给SJM,这样SJM就有4块积木,此时可以满足第1个的需求,所有可以和2个小朋友合照。

样例2:SJM一开始只能满足第2个小朋友的需求,然后积木数量变为3,还是不能满足第1个小朋友的需求,所以最多只能和1个小朋友合照。

ITS-EASY

#include <iostream>

#define SIZE 1001

using namespace std;

int a[SIZE], b[SIZE];
bool v[SIZE]; // 有没有弄(?)过

int main(int argc, char** argv)
{
	int n, s, i, t = 0;
	bool flag;
	
	cin >> n >> s;
	for (i = 1; i <= n; i++)
	{
		cin >> a[i] >> b[i]; // 读入数据
	}
	
	for ( ; ; )
	{
		flag = true;
		for (i = 1; i <= n; i++)
		{
			if ((!v[i]) && (s >= b[i])) // 若有一个符合条件
			{
				s += a[i];
				v[i] = true;
				t++;
				flag = false;
			}
		}
		if (flag) // 如果再没有则输出结果
		{
			cout << t << endl;
			return 0;
		}
	}
	
	return 0;
}

猜你喜欢

转载自blog.csdn.net/drtlstf/article/details/80258625