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;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值