题目链接:http://hihocoder.com/problemset
题解:枚举行数,然后随便模拟下。
#include <bits/stdc++.h>
using namespace std;
const int N = 10007;
using ll = long long ;
using ld = long double ;
#define ALL(X) begin(X), end(X)
#define mp make_pair
#define SZ(X) ((int)X.size())
string T;
int n, K;
int line[N], ans[N];
int bit(int num)
{
int cnt = 0;
if(!num) return 1;
while(num) cnt ++, num /= 10; return cnt;
}
bool check(int h)
{
for(int i = 1;i <= h;i ++) ans[i]=0;
int p = 0, cnt = 1, now = 0;
for(int i = 1;i <= h;i ++) line[i] = K - (bit(i) + bit(h) + 3);
while(p < n) {
if(cnt > h) return 0;
if(T[p] == ' ') {
ans[cnt] ++;
p ++;
now ++;
if(now >= line[cnt]) {
cnt ++;
now = 0;
}
} else {
int tmp = p, tnow = now;
while(tmp < n && T[tmp] != ' ') {
now ++;
tmp ++;
}
if(now <= line[cnt]) {
while(p < tmp) {
ans[cnt] ++;
p ++;
}
if(now == line[cnt]) {
cnt ++;
now = 0;
}
} else {
cnt ++;
now = 0;
}
}
}
return cnt <= h;
}
int main()
{
cin >> K;
char ch = getchar();
while(ch != '\n') ch = getchar();
getline(cin, T);
n = SZ(T);
int i;
for(i = 1;i <= n;i ++) {
if(check(i)) break;
}
int st = 0;
for(int j = 1;j <= i;j ++) {
for(int k = 1;k <= ans[j];k ++) {
cout << T[st++];
}
printf("(%d/%d)\n",j,i);
}
return 0;
}