链接: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;
}