M - Maratona Brasileira de Popcorn( 二分答案 )
题意:输入三个数n,c,t 。 桌子上有n堆爆米花,每一堆有ai个, 现在有c个人一起吃爆米花,每人每分钟最多能吃t个爆米花,但有两个规定:1.一堆爆米花只能一个人吃, 2.每个人只能吃连续的若干堆爆米花。
思路:二分天数,然后暴力尝试。
注:一般来说, 若题目要求输出一个确定的数( 比如最小天数,最大个数之类 ),用二分来枚举答案。
代码:
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 1e5+10;
ll a[maxn];
ll n,c,t;
int main()
{
cin >> n >> c >> t;
ll left=1, right=0, mid,ans=0x3f3f3f3f;
for ( ll i=0; i<n; i++ ) {
scanf("%d",&a[i]);
right += a[i];
}
while ( left<=right ) {
mid = (left+right)/2;
ll want = t*mid; // 一个人最多吃这些
ll now = 0;
ll cnt = 1; // 当前人数
for ( ll i=0; i<n; i++ ) {
if ( a[i]>want ) { // 如果有一堆爆米花大于want, 肯定不可能
cnt = 0x3f3f3f3f;
break ;
}
now += a[i];
if ( now>want ) {
cnt ++;
now = a[i];
}
}
if ( cnt>c ) { // 用的人数超出限定, 是天数太少了
left = mid+1;
}
else {
ans = mid; // 只有在可能的条件下才更新答案
right = mid-1;
}
}
cout << ans << endl;
return 0;
}