M - Maratona Brasileira de Popcorn
解题思路:
核心思想:二分法+枚举
最少的天数为一天,最多的天数为所有数的总和。采用二分,如果中间这个天数下所需人数超出限制,则证明天数太少,应该向右寻找。若果没有超出限制,则向左寻找,并更新天数。
转载:https://blog.csdn.net/weixin_43828245/article/details/101635396
代码:
#include <bits/stdc++.h>
using namespace std;
#define int long long
signed main()
{
int n,m,k;
scanf("%lld%lld%lld",&n,&m,&k);
int a[100001];
int left=1,right=0;
for(int i=1; i<=n; i++)
{
scanf("%lld",&a[i]);
right+=a[i];
}
int want;
int ans=0x3f3f3f3f;
while(left<=right)
{
int mid;
mid=(left+right)/2;
want=mid*k;
int num=1;
int sum=0;
for(int i=1; i<=n; i++)
{
if(a[i]>want)
{
num=0x3f3f3f3f;
break;
}
sum+=a[i];
if(sum>want)
{
num++;
sum=a[i];
}
}
if(num>m)
{
left=mid+1;
}
else
{
ans=mid;
right=mid-1;
}
}
printf("%lld\n",ans);
return 0;
}