Formatting Text
Time Limit: 1000MS | Memory Limit: 10000K | |
Total Submissions: 717 | Accepted: 147 |
Description
Writings e-mails is fun, but, unfortunately, they do not look very nice, mainly because not all lines have the same lengths. In this problem, your task is to write an e-mail formatting program which reformats a paragraph of an e-mail (e.g. by inserting spaces) so that, afterwards, all lines have the same length (even the last one of each paragraph).
The easiest way to perform this task would be to insert more spaces between the words in lines which are too short. But this is not the best way. Consider the following example:
In the output, every line has to start and to end with a word. (I.e. there cannot be a gap at the beginning or the end of a line.) The only exception to this is the following:
If a line contains only one word this word shall be put at the beginning of the line, and a badness of 500 is assigned to this line if it is shorter than it should be. (Of course, in this case, the length of the line is simply the length of the word.)
The easiest way to perform this task would be to insert more spaces between the words in lines which are too short. But this is not the best way. Consider the following example:
****************************Let us assume that we want to get lines as long as the row of stars. Then, by simply inserting spaces, we would get
This is the example you are
actually considering.
****************************But this looks rather odd because of the big gap in the second line. By moving the word ``are'' from the first to the second line, we get a better result:
This is the example you are
actually considering.
****************************Of course, this has to be formalized. To do this, we assign a badness to each gap between words. The badness assigned to a gap of n spaces is (n - 1)^2. The goal of the program is to minimize the sum of all badnesses. For example, the badness of the first example is 1 + 7^2 = 50 whereas the badness of the second one is only 1 + 1 + 1 + 4 + 1 + 4 = 12.
This is the example you
are actually considering.
In the output, every line has to start and to end with a word. (I.e. there cannot be a gap at the beginning or the end of a line.) The only exception to this is the following:
If a line contains only one word this word shall be put at the beginning of the line, and a badness of 500 is assigned to this line if it is shorter than it should be. (Of course, in this case, the length of the line is simply the length of the word.)
Input
The input contains a text consisting of several paragraphs. Each paragraph is preceded by a line containing a single integer n, the desired width of the paragraph (1 <= n <= 80).
Paragraphs consist of one or more lines which contain one or more words each. Words consist of characters with ASCII codes between 33 and 126, inclusive, and are separated by spaces (possibly more than one). No word will be longer than the desired width of the paragraph. The total length of all words of one paragraph will not be more than 10000 characters.
Each paragraph is terminated by exactly one blank line. There is no limit on the number of paragraphs in the input file.
The input file will be terminated by a paragraph description starting with n=0. This paragraph should not be processed.
Paragraphs consist of one or more lines which contain one or more words each. Words consist of characters with ASCII codes between 33 and 126, inclusive, and are separated by spaces (possibly more than one). No word will be longer than the desired width of the paragraph. The total length of all words of one paragraph will not be more than 10000 characters.
Each paragraph is terminated by exactly one blank line. There is no limit on the number of paragraphs in the input file.
The input file will be terminated by a paragraph description starting with n=0. This paragraph should not be processed.
Output
Output the same text, formatted in the way described above (processing each paragraph separately).
If there are several ways to format a paragraph with the same badness, use the following algorithm to choose which one to output: Let A and B be two solutions. Find the first gap which has not the same length in A and B. Do not output the solution in which this gap is bigger.
Output a blank line after each paragraph.
If there are several ways to format a paragraph with the same badness, use the following algorithm to choose which one to output: Let A and B be two solutions. Find the first gap which has not the same length in A and B. Do not output the solution in which this gap is bigger.
Output a blank line after each paragraph.
Sample Input
28
This is the example you are
actually considering.
25
Writing e-mails is fun, and with this program,
they even look nice.
0
Sample Output
This is the example you
are actually considering.
Writing e-mails is fun,
and with this program,
they even look nice.
Source
题目大意:
在graph的单词之间添加空格,使得每一行的长度是给出的n,两单词间k个空格的不满意度是(k-1)^2,求一种方法使得空格造成的不满意度最小,并且行首行尾均为单词(除非一行只有一个单词,如果此单词长度<n 不满意度数为500)。
构造的最优解是使得前面的空格个数尽量的小。
分析:
1.无论分成多少行,每个单词前面的空格个数和行数无关。
2.每行必有一个单词开头和结尾(特殊情况特殊讨论);
那么根据这两个条件就可以知道:
以某个单词为某一行结尾的最优的解(设mn[i])一定和以他前面的某个单词结尾的最优值有关系;并且他们之间的单词和这个i单词在一行;
这样就很容易知道以最后一个单词为一行结尾的最优值是多少了~;
3.上面的问题并没有完全解决,如果i----j单词是一行的话那么最优解是多少呢。。
这个也简单,预处理一下就好了,就是i----j单词是一行要用规定的n个格子,那么枚举j单词前面的空格数k,就是要知道i----j-1单词用了n-len[j]-k个格子的最优值就可以了~;
但是!有大牛想到了一个特性:平方和最小,一定是大家都很平均了!那么就是尽量的平分。。任意两个空格长度相差不到2的时候当然一定最优。
现在最优解的求解已经完成了。
看如何构造特定的一组解。
4.规定前面的空格数尽量的小====>前面的单词尽量的紧密-===>前面的单词占的行数尽量的少同时后面的行单词尽量的少===>可以记录当前最优值能使得i所在的行号,另外枚举上一行最后一个单词的时候应该从后向前枚举,保证的是i在当前行的所有情况下当前行的单词尽量的少,也就是保证了前面的单词尽量的多~
这样就可以求出最优解了~
后记:
1.最开始看的时候就想到了类似方差的问题,在隔了一天之后想到mn[M]的方法的时候竟然毫无感觉的想去预处理枚举。。。思维很。。。。
2.在没有提示的条件下首先想着测试数据,被老大发现之后进行说服教育...感触很深,对么。。。怎么可以这么懒呢。。思想懒惰很可怕。。。
3.自己想的时候想到了mn[M][R]的方法表示的当前单词占据在某一行的第j个位置时候的最优值,可惜啊。。。没有想到需要行数尽量的小。。。显然没有感觉到问题的本质。。。想法很浮躁,想“懂”了就写。。。服了。。
4.和老大讨论过之后就觉得那是对的,根本没有深想。。pe了多少次。。。。。还以为是细节出问题了。。。。再这么懒就会变成sz的!