D.Magazine Ad
输入一行字符串,字符串中由空格和分隔符将字符串分割为n个单词,现在要求将这n个单词分为多块,一块里面可以有一个或者多个单词,现在我们选取一个最优的划分方法:划分块之后,让最长的那个块的长度尽量小。输出该长度。 —— [ 题目链接 ]
二分贪心
思路
对题意进行分析,可以知道分割符和空格可以看为一样,有空格和分隔符的单词长度也需要自加1。 接下来对答案进行二分即可。
代码
#include <stdio.h>
#include <iostream>
#include <string.h>
#include <algorithm>
#define Max(a, b) (a > b ? a: b)
#define Min(a, b) (a < b ? a: b)
#define MAX 1000050
#define INF 0x3f3f3f3f
using namespace std;
int a[MAX];
bool solve(
int m,
int n,
int k){
int sum =
0;
int key =
0;
for(
int i =
0; i <= n; i++){
sum += a[i];
if(sum > m){
key++;
i--;
sum =
0;
}
}
if(key >= k)
return true;
else return false;
}
int main(){
int k, n =
0, tot =
0;
scanf(
"%d", &k);
getchar();
memset(a,
0,
sizeof(a));
char t = getchar();
while(t !=
'\n'){
if(t ==
' ' || t ==
'-'){
a[n]++;
tot++;
n++;
}
else {a[n]++; tot++;}
t = getchar();
}
int l = -INF, h = tot;
for(
int i =
0; i <= n; i++)
l = l < a[i]? a[i]: l;
while(l <= h){
int mid = (h - l) /
2 + l;
if(solve(mid, n, k)){
l = mid +
1;
}
else h = mid -
1;
}
cout << l << endl;
return 0;
}