链接
http://codeforces.com/problemset/problem/803/D
题目大意
这个格式说起来很麻烦,具体看样例吧。
大体就是说给你一大串字符,然后你要把他们从分隔符处断开(分隔符归到前面的字符串中),要求行数不大于
k
,问你最短的列宽
题解
二分答案+贪心判定
(你还想让我说什么??)
代码
//二分答案
#include <cstdio>
#include <algorithm>
#define maxn 1000010
using namespace std;
char s[maxn];
int a[maxn], K, N, low;
bool check(int x)
{
int i, t=x, cnt=1;
for(i=1;i<=N;i++)
if(a[i]<=t)t-=a[i];
else t=x-a[i], cnt++;
return cnt<=K;
}
int init()
{
int i, last=0;
scanf("%d\n",&K);
gets(s+1);
for(i=1;s[i];i++)if(s[i]=='-' or s[i]==' ')a[++N]=i-last, last=i;
a[++N]=i-1-last;
for(i=1;i<=N;i++)low=max(low,a[i]);
}
int main()
{
int l, r, mid;
init();
for(l=low,r=maxn;l<r;)
{
mid=l+r>>1;
if(check(mid))r=mid;
else l=mid+1;
}
printf("%d",l);
return 0;
}