Problem Description
众所周知,华农兄弟喜欢养殖竹鼠。他们的养殖厂里总共有n只竹鼠,他们非常疼爱自己家的竹鼠 。
华农兄弟总共贮存了m个竹片,每根竹片有他们所属的种类。
竹鼠为了避免因吃的太多,被华农兄弟做成烤竹鼠,所以每天只吃一个竹片。
同时,为了防止自己吃坏肚子,所以每只竹鼠只吃同一类竹子。(不同的竹鼠可以吃相同类别的竹子)
现在华农兄弟想知道,自己贮存的竹片最多能够同时喂养这n只竹鼠多少天。他们觉得你很" 漂亮 ",所以决定请你帮忙解决这个问题。
Input
第一行包含两个整数 n 和 m(1 ≤ n ≤ 100,1 ≤ m ≤ 100)——竹鼠的数目和竹片数量。
第二行包含整数序列 a1、a2、…、am ( 1 ≤ ai ≤ 100 ) ,其中 ai 是第i个竹片的类型。
Output
输出贮存的竹片最多能够同时喂养n只竹鼠多少天,假设一天都不可能,输出0。
Sample Input
4 10
1 5 2 1 1 1 2 5 7 2
Sample Output
2
Hint
有4只竹鼠,10个竹片。
其中’ 1 ‘类竹片共4个, ’ 2 ’ 类竹片共3个,’ 5 ‘类竹片共2个,’ 7 '类竹片共1个。
一种最优的方案是:让第一只和第二只竹鼠吃’ 1 ‘类竹片,让第三只竹鼠吃’ 2 ‘类竹片,让第四只竹鼠吃’ 5 '类竹片,这样最多能够同时喂养这n只竹鼠2天。
题解:
这个题直接求可以喂养几天难求,但是可以通过枚举,给出天数,来判断是否能喂养到这个天数,从而求出最大的天数。
#include <iostream>
#include <stdio.h>
int num[300],n,m;
bool f(int x){ //判断是否能养殖x天
int tot=0; //记录可以养殖多少只竹鼠
for(int i = 1;i <= 100;i ++) tot += num[i]/x;
if(tot >= n) return 1; //如果可以养殖的竹鼠大于等于n则说明合法
else return 0;
}
int main(){
scanf("%d%d",&n,&m);
for(int i = 1;i <= m;i++){
int x;
scanf("%d",&x);
num[x]++; //记录x类竹片的个数
}
int ans = 0;
for(int i = 1;i <= m;i++) //枚举答案
if(f(i)) ans = i; //如果所枚举的答案合法,则记录
printf("%d",ans);
return 0;
}