题目链接:https://vjudge.net/contest/397282#problem/M
题解:这个题的意思时:c个人比赛吃东西,吃的东西必须满足两个条件:
1.一个人吃的东西必须相邻
2.每个地方的东西必须一个人全吃完
求最小的时间
这个题其实就是判断:把一段连续的数切c份,判断最大值最小是多少。
对于这种求最小值得问题来说,可以二分总的大小来判断
代码:
#include<iostream>
#include<algorithm>
#include<string>
#include<cstring>
#include<cstdio>
#define maxn 100100
typedef long long ll;
ll a[maxn];//储存数
int c;//可以切c份
int t;//每秒吃的多少
int n;//个数
using namespace std;
int main()
{
ll sum=0;
ll left,right;
scanf("%d%d%d",&n,&c,&t);
for(int i=0; i<n; i++)
{
scanf("%lld",&a[i]);
sum+=a[i];
}
right=sum;
left=1;
ll ans;
while(left<=right)//二分可以切的份数
{
ll mid=(left+right)/2;//份数
ll maxnn=mid*t;//一个人最多吃这些
int f=1;//以这个最大值能吃的份数,
ll maxx=0;//以这个最大值每个人最多吃份数比较
//f<=c时,说明答案成立,但存在maxn大了情况,往左二分
//f>c时,说明maxn小了,往右二分
for(int i=0; i<n; i++)
{
if(f>c||a[i]>maxnn)//分的份数多了//特殊情况,其中一份大于一个人能吃的最大份数
{
f=maxn;
break;
}
maxx+=a[i];
if(maxx>maxnn)
{
f++;
maxx=a[i];
}
}
if(f>c)//超过限定范围
left=mid+1;
else
{
ans=mid;
right=mid-1;
}
}
printf("%lld\n",ans);
return 0;
}