2. 拖地
题目ID:8717必做题100分
最新提交:
Runtime Error
0 分
历史最高:
Runtime Error
0 分
时间限制: 1000ms
空间限制: 262144kB
题目描述
WYZX的所有学生获得了一个大扫除的机会——去走廊拖地。 WYZX的走廊被分成了 MM 段,每段的长度不一定相同。WYZX一共有 NN 名学生参加劳动,这些学生将分成 MM 组来完成这项工作,因为长度不同,分配的任务量肯定不同,现在,负责这次大扫除的老师想知道,拖地长度最多的同学最少必须拖多长的走廊,这样才能保证尽可能的公平。当然,可以有学生当拉拉队,不用拖地,但是每段走廊必须要拖干净。 比如:有 5 名学生,2 段走廊,第一段长度为 7 ,第二段长度为 4. 可以让 3 个人负责拖长度为 7 的走廊,2 个人负责长度为 4 的走廊,那么拖第一段的某个人必须要拖长度为 3 的地面,而其他的人拖长度为 2 的地面。这样就有 1 位同学必须拖长度为 3 的地面。
输入格式
第一行:两个整数 N 和 M (1 ≤ N ≤ 109109, 1 ≤ M ≤ 300000, M ≤ N)
接下来 M 行,每行一个整数,表示每段走廊的长度,保证走廊的长度在 [11,109109] 之间。
输出格式
一个整数,如题目描述,任务量最重的同学拖地长度的最小值。
样例
Input 1
7 5 7 1 7 4 4
Output 1
4
数据范围
20%数据保证 N ≤ 30, M ≤ 20
40% 数据保证 N ≤ 10000, M ≤ 1000
100% 数据保证 如题目描述
(不会格式化!!!教一下)
#include <bits/stdc++.h>
#define ll long long
#define ull unsigned long long
using namespace std;
ll n, k, a[300005];
bool check(ll k){
ll cs=0;
for(ll i=1;i<=n;i++){
if(a[i]%k==0){
cs+=a[i]/k;
}
else{
cs+=a[i]/k+1;
}
}
return cs<=n;
}
int main()
{
cin >> n >> k;
for(ll i = 1;i <= k;i++)
cin >> a[i];
ll l = 1, r = k;
while(l + 1 < r)
{
ll mid = (l + r) / 2;
if(check(mid) == 0) l = mid;
else r = mid;
}
cout << r << endl;
return 0;
}
蒟蒻求救RE0pt!!!