二分。
首先把字符串处理成一个数组,二分答案,判断一下即可。
#include <cstdio> #include <cmath> #include <set> #include <cstring> #include <algorithm> using namespace std; int p; int a[1000010],sz; char s[1000010]; void work() { int sum=0; for(int i=0;s[i];i++) { sum++; if(s[i]==' ') { a[sz++] = sum; sum=0; } else if(s[i]=='-') { a[sz++] = sum; sum=0; } } if(sum) { a[sz++] = sum; } } bool check(int x) { int sum=0; int y=0; for(int i=0;i<sz;i++) { if(a[i]>x) return 0; } for(int i=0;i<sz;i++) { if(sum+a[i]<=x) { sum=sum+a[i]; } else { sum = a[i]; y++; } } if(sum) y++; if(y<=p) return 1; return 0; } int main() { scanf("%d",&p); getchar(); gets(s); work(); int ans,L=1,R=1000000; while(L<=R) { int mid = (L+R)/2; if(check(mid)) ans = mid,R = mid-1; else L = mid+1; } printf("%d ",ans); return 0; }