码迷,mamicode.com
首页 > 其他好文 > 详细

文件排版

时间:2016-08-20 19:10:51      阅读:258      评论:0      收藏:0      [点我收藏+]

标签:

写电子邮件是有趣的,但不幸的是经常写不好看,主要是因为所有的行不一样长,你的上司想要发排版精美的电子邮件,你的任务是为他编写一个电子邮件排版程序。
完成这个任务最简单的办法是在太短的行中的单词之间插入空格,但这并不是最好的方法,考虑如下例子:
****************************
This is the example you  are
actually considering.
假设我们想将第二行变得和第一行一样长,靠简单地插入空格则我们将得到如下结果:
****************************
This is the example you  are
actually             considering.

但这太难看了,因为在第二行中有一个非常大的空白,如果将第一行的单词“are”移到下一行我们将得到较好的结果:
****************************
This  is  the  example   you
are  actually   considering.

当然,这必须对难看程度进行量化。因此我们必须给出单词之间的空格的难看程度,一个包含N个空格符的空白段,其难看程度值为(n-1)2,程序的目的是使难看程度的总和最小化。例如,第一个例子的难看程度是1+7*7=50,而第二个例子的难看程度仅为1+1+1+4+1+4=12。
输出时,每一行的开头和结尾处都必须是一个单词,即每行开头和结尾处不能有空白。唯一例外的是该行仅有一个单词组成的情况,对于这种情况你可将单词放在该行开头处输出,此时如果该单词比该行应有的长度短则我们指定它的最坏程度为500,当然在这种情况下,该行的实际长度即为该单词的长度。

输入
输入文件第一行是一个整数N,表示该段要求达到的宽度,1<=N<=80。该段文章由一个或多个单词组成,单词由ASCII码值为33到126(包含33和126)的字符组成,单词与单词之间用空格隔开(可能超过一个)。单词长度不会超过段落要求达到的宽度。一段文字所有单词的总长度不会超过10000个字符,任何一行都不会超过100个字符,任何一个单词都在同一行内。

输出
对于每个段落,找出使其难看程度最小的排版形式并输出句子:“Minimal badness is B.”,B是指按可能的最好排版形式会发生的难看程度值。注意排版后文本行数任意,多余的空格也可删除。

样例
输入:
28
This is the example you  are
actually considering.

输出:
Minimal badness is 12.

 

定义f[i]表示某行以i结尾的最小丑陋程度,

那么f[i]=min(f[k]+cocl(k+1,i));(0<k<i),cocl(k+1,i)表示从k+1到i为一行时最小的丑陋的程度,这个比较好推,建议自己推一下。

 

 1 #include <cstdio>
 2 #include <cstring>
 3 #include <iostream>
 4 #include <algorithm>
 5 
 6 using namespace std;
 7 
 8 int wid,tot,word[1005];
 9 long long sum[1005],f[1005];
10 char words[105];
11 int sq(int a){return a*a;}
12 
13 int ca(int a,int b){
14     int k=b-a,l,h=sum[b]-sum[a-1]+b-a;
15     if(h>wid) return 1000000;
16     if(h==wid) return 0;
17     l=wid-h;
18     return (l%k)*sq(l/k+1)+(k-l%k)*sq(l/k);
19     
20 }
21 
22 
23 int main( ){
24     scanf("%d",&wid);
25     while (~scanf ("%s", words)) word[++tot] = strlen (words);
26     for(int x=1;x<=tot;x++)sum[x]=sum[x-1]+word[x];
27     for(int x=1;x<=tot;x++){
28         f[x]=f[x-1];
29         if(sum[x]-sum[x-1]!=wid) f[x]+=500;
30         for(int k=1;k<=x-1;k++){
31             f[x]=min(f[x],f[k-1]+ca(k,x));
32         }
33     }
34     cout<<"Minimal badness is "<<f[tot]<<".";
35     return 0;    
36 }

 

文件排版

标签:

原文地址:http://www.cnblogs.com/Ateisti/p/5790854.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!