【贪心算法】活动人数

Description
小洪的老师想用奖品来调动学生参加某项智力比拼活动的积极性,奖品有一个初始的吸引值 L(1 <= L <= 50)。已知每一个学生都有一个抵抗诱惑的值ri(0 <= ri<=100),只有奖品的吸引值大于或者等于学生的抵抗诱惑值时,这个学生才会积极参加这个项活动。随着活动的开展,每当有一名学生积极参加这项活动时,会使这个奖品的吸引值增加 k (1 <= k<= 20),从而可能使得先前不够积极的同学抵挡不住诱惑从而参与进来。现在小洪的班中共有 n (1 <=n<= 1000) 位同学,小洪想请你帮忙统计出最终会积极参加这项活动的最大人数。
Input
第一行三个整数 n、L、k,分别代表小洪班人数、奖品初始吸引值和每增一人参与活动时奖品吸引值的增加值。第二行:n 个整数,代表每个学生的抵抗诱惑的值。
Output
一个整数,代表最后有多少学生参加这项活动。
Sample Input
5 2 3 
2 6 12 5 14 
Sample Output
3
HINT
【样例解释】:奖品的初始吸引值是 2,那么只有第一位学生(2<=2)参加这项活动,因为有一位学生参加活动,那么奖品的吸引力就增加为:2+3=5,刚好第四位学生抵抗诱惑值为 5,那么第四位同学也参加这项活动,奖品的吸引力变为:5+3=8,这样只有第二位学生的诱惑值 6<8,那么第 2 位学生也参加活动,使奖品吸引力变为:8+3=11,最后再也没有学生的诱惑值小于等于 11,这样就只有 3 位学生参加这项活动。

和上一题(合照)很类似

#include <iostream>

#define SIZE 15000

using namespace std;

int a[SIZE];
bool v[SIZE];

int main(int argc, char** argv)
{
	int n, i, t = 0, l, k;
	bool flag;
	
	cin >> n >> l >> k;
	for (i = 1; i <= n; i++)
	{
		cin >> a[i];
	}
	
	for ( ; ; )
	{
		flag = true;
		for (i = 1; i <= n; i++)
		{
			if ((!v[i]) && (l >= a[i]))
			{
				t++;
				v[i] = true;
				flag = false;
				l += k;
			}
		}
		if (flag)
		{
			cout << t << endl;
			return 0;
		}
	}
	
	return 0;
}

猜你喜欢

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