今天晚上cl叫我写的,我打开一看,一开始没什么思路,感觉很像DP,后来他说就二分就可以了。然后我突然想到这不就是四省赛热身赛的题么,而且白书上也有写题解。。o(︶︿︶)o 唉,题没做还是不熟悉。
因为是把天数化成连续的几段,所以把答案进行二分查找,每个答案可以用线性的时间判断对错,因此总的时间是nlogn。
#include <cstdio>
#include <cstring>
#include <iostream>
#define MAXN 100050
using namespace std;
int g[MAXN];
int s;
int N,M;
bool solve(int m){
int len=1;
int tt=0;
for(int i=0;i<N;i++){
if(tt+g[i]<=m)
{
tt=tt+g[i];
}
else
{
if(g[i]>m)return false;
tt=g[i];len++;
}
}
if(len<=M)
return true;
else return false;
}
int main(){
while(scanf("%d%d",&N,&M)==2){
s=0;
for(int i=0;i<N;i++)
{
scanf("%d",&g[i]);
s+=g[i];
}
int l=0,r=s;
int ans=0;
while(l<=r){
int mid=(l+r)>>1;
if(solve(mid)){
ans=mid;
r=mid-1;
}
else{
l=mid+1;
}
}
printf("%d\n",ans);
}
return 0;
}