Codeforces 1011B - Planning The Expedition

链接:Codeforces 1011B - Planning The Expedition

大意:有n个人去探险,他们一共有m袋食物,每袋食物包含1单位的食物ai。每个人每天消耗1单位的食物,且探险过程中只能携带1种食物(即不能既携带食物a,又携带食物b),求这n个人最长可以探险几天。(1<=n,m,ai<=100)

思路:水题,食物种类不超过100,直接用数组储存,假设可以探险d天,那么每种食物的数量/d即是该种食物可以支持的最大人数,统计所有100种食物即可得到m袋食物可以支持探险d天的最大人数,大于n则说明可行,否则不可行。则可以循环0-100找出最长天数,或者利用二分查找结果亦可。注意:有可能食物不足以支持探险1天,所以d应该从0开始查询。

代码:

#include<iostream>
#include<cstring>
#include<algorithm>

using namespace std;

int foods[101];

int find_res(int people, int l, int r)
{
	int p = 0;
	if (r - l == 1)
	{
		for (int i = 0; i <= 100; i++)
			p += foods[i] / r;
		if (p >= people)
			return r;
		else
			return l;
	}
	int m = (l + r) >> 1;
	for (int i = 0; i <= 100; i++)
		p += foods[i] / m;
	if (p >= people)
		return find_res(people, m, r);
	else
		return find_res(people, l, m);
}

int main()
{
	int n, m;
	while (cin >> n >> m)
	{
		int type;
		memset(foods, 0, sizeof(foods));
		for (int i = 0; i < m; i++)
		{
			cin >> type;
			foods[type]++;
		}
		cout << find_res(n, 0, 100) << endl;
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/lkqlxjlxr71/article/details/81235200
今日推荐