打卡信奥刷题(570)用C++信奥P7585[普及组/提高] [COCI2012-2013#1] LJUBOMORA
[COCI2012-2013#1] LJUBOMORA
题目描述
一家弹珠厂向一所幼儿园捐赠了一些弹珠,弹珠一共有 M M M 种颜色,每颗弹珠都有一种颜色。老师需要把所有的弹珠分给 N N N 个孩子。每个孩子得到的所有弹珠都必须是相同的颜色,而且可以有一些孩子一颗弹珠也没得到。
我们把嫉妒值定义为分给一个孩子最多的弹珠数量。请你帮助老师分弹珠,使得嫉妒值最小。
例如,如果有 4 4 4 个红色的弹珠( RRRR \texttt{RRRR} RRRR)和 7 7 7 个蓝色的弹珠( BBBBBBB \texttt{BBBBBBB} BBBBBBB),要分给 5 5 5 个孩子,那么我们可以这样划分: RR \texttt{RR} RR, RR \texttt{RR} RR, BB \texttt{BB} BB, BB \texttt{BB} BB, BBB \texttt{BBB} BBB。这样分的嫉妒值为 3 3 3,是最小的。
输入格式
输入共 M + 1 M+1 M+1 行。
第一行包含两个正整数 N , M N,M N,M,分别表示孩子数和弹珠的颜色总数。
接下来 M M M 行的第 i i i 行包含一个正整数 x x x( x ∈ [ 1 , 1 0 9 ] x \in [1,10^9] x∈[1,109]),表示有 x x x 个颜色为 i i i 的弹珠。
输出格式
输出一行一个整数,表示最小的嫉妒值。
样例 #1
样例输入 #1
5 2
7
4
样例输出 #1
3
样例 #2
样例输入 #2
7 5
7
1
7
4
4
样例输出 #2
4
提示
【数据范围】
对于 100 % 100\% 100% 的数据,保证 1 ≤ M ≤ 3 × 1 0 5 1 \le M \le 3 \times 10^5 1≤M≤3×105, 1 ≤ N ≤ 1 0 9 1 \le N \le 10^9 1≤N≤109, M ≤ N M \le N M≤N。
【说明】
本题分值按 COCI 原题设置,满分 120 120 120。
题目译自 COCI2012-2013 CONTEST #1 T4 LJUBOMORA。
C++实现
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N = 300000 + 10;
ll n, m, l, r, ans, mid, a[N];
bool check(ll x){
ll sum = 0;
for(int i=1;i<=m;i++){
sum += a[i] / x;
if(a[i] % x != 0) sum++;
}
return sum <= n;
}
int main(){
cin >> n >> m;
for(int i=1;i<=m;i++){
cin >> a[i];
r += a[i];
}
while(l <= r){
mid = (l + r) >> 1;
if(check(mid)){
r = mid - 1;
ans = mid;
}else l = mid + 1;
}
cout << ans << endl;
return 0;
}

后续
接下来我会不断用C++来实现信奥比赛中的算法题、GESP考级编程题实现、白名单赛事考题实现,记录日常的编程生活、比赛心得,感兴趣的请关注,我后续将继续分享相关内容
更多推荐



所有评论(0)