CF1011B

题目链接

题目描述

有N个人M份食物,每人每天吃一份食物,每份食物有一个种类ai,一个人从开始到结束只能吃一种类型的食物,问最多能坚持几天.

输入输出格式

输入格式:

第一行n,m
第二行m个数,表示每份食物的种类

输出格式:

一个整数,表示最大能坚持的天数.

样例

输入样例 输出样例
4 10 2
1 5 2 1 1 1 2 5 7 2
100 1 0
1

思路

1.二分

统计每种类型食物份数
然后从大到小排序
二分最大天数
枚举统计是否成立

#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <queue>
#include <stack>
#include <list>
#include <set>
#include <map>
#define ll long long
#define ull unsigned long long
#define ci const int&
#define cl const long long&
#define cul const undigned long long&
#define io_f std::ios::sync_with_stdio(false)
using namespace std;

int n,m;
int arr[101];

inline bool cmp(ci x,ci y) {
	return x>y;
}

inline bool check(ci x) {
	int tmp=n;
	for(int i=1;i<=m&&tmp>0;i++) {
		tmp-=arr[i]/x;
	}
	if(tmp<=0)return 1;
	return 0;
}

int main() {
	io_f;
	int a;
	cin>>n>>m;
	for(int i=1;i<=m;i++) {
		cin>>a;
		arr[a]++;
	}
	sort(arr+1,arr+100+1,cmp);
	int l=0,r=200;
	while(l+1<r) {
		int mid=(l+r)>>1;
		if(check(mid))l=mid;
		else r=mid;
	}
	cout<<l;

	return 0;
}
posted @ 2018-07-28 23:06  ullio  阅读(89)  评论(0编辑  收藏  举报