题目描述
娜塔莎正计划为当地人去火星探险。重要的任务之一是为每个参与者提供食
物。仓库每天都有食品包装。每个包裹都有一些食物类型的ai。每个参与者
必须每天吃一包食物。由于极端的负荷,每个参与者都必须在整个探险过程
中吃同样的食过程中吃同样的食物。不同的参与者可能吃不同(或相同)类型
的食物。正式地说,对于每个参与者,j娜塔莎应该选择他的食物类型bj和
每天j-的参与者将吃一个食品包类型的bj。不同参与者的bj值可能不同。按
照上述要求,探险队可以持续的最大天数是多少?
Input
第一行包含两个整数nn和m(1≤n≤100,1≤m≤100)-探险队参加人数和可
用的每日食品包数。
Output
打印单个整数-探险队可以持续的天数。如果连一天都无法计划远征,请打
印0。
Examples
input
4 10
1 5 2 1 1 1 2 5 7 2
output
2
input
100 1
1
output
0
input
2 5
5 4 3 2 1
output
1
input
3 9
42 42 42 42 42 42 42 42 42
output
3
解题思路
思维转化,枚举每一天看看考察队能不能活过第 i 天。或者说如果探险队要活过第 i 天最多可以
有多少个人。如第一个样例 1(4个), 2(2个),5(3个),7(1个)。如果探险一天可以养活
4/1+2/1+3/1+1/1 (10)个人, 如果探险两天可以养活4/2+2/2+3/2+1/2 (4个)探险三天
可以养活4/3+2/3+3/3+1/3 (2个).......
Note
在第一个示例中,Natasha可以将第1类型的食物分配给第一参与者,类型1
分配给第二位,类型5分配给第三位,类型2分配给第四位。在这种情况下,
考察可以持续2天,因为每个参与者都可以获得他的食物类型的两个食品包
(将使用4个1型包、两个类型2包和两个5型包)。在第二个例子中,有100个
参与者,只有一个食品包。在这种情况下,探险队甚至不能持续一天。
I have a dream!A AC dream!!
/*
_ooOoo_
o8888888o
88" . "88
(| -_- |)
O\ = /O
____/`---'\____
.' \\| |// `.
/ \\||| : |||// \
/ _||||| -:- |||||- \
| | \\\ - /// | |
| \_| ''\---/'' | |
\ .-\__ `-` ___/-. /
___`. .' /--.--\ `. . __
."" '< `.___\_<|>_/___.' >'"".
| | : `- \`.;`\ _ /`;.`/ - ` : | |
\ \ `-. \_ __\ /__ _/ .-` / /
======`-.____`-.___\_____/___.-`____.-'======
`=---='
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
I have a dream!A AC dream!!
*/
# include<cstdio>
# include<cstring>
# include<algorithm>
using namespace std;
int n, m;
int a[105], b[105];
int main()
{
while(scanf("%d%d", &n, &m)!=EOF)
{
int ans = 0;
for(int i=0; i<m; i++)
scanf("%d", &a[i]);
for(int i=0; i<m; i++)
b[a[i]]++; //b[i]表示 i 种食物有 b[i]个
for(int i=1; i<=100; i++)
{
int sum = 0;
for(int j=1; j<=100; j++)
{
sum = sum + b[j]/i;
}
if(sum>=n)
ans=i; //更新天数
else break; //可以养活的人数效应 n 退出循环
}
printf("%d\n", ans);
for(int i=0; i<100; i++)
{
a[i] = 0;
b[i] = 0;
}
//
// for(int i=0; i<m; i++)
// printf("%d ", b[i]);
// printf("\n");
// for(int i=0; i<m; i++)
// printf("%d ", a[i]);
}
return 0;
}