文件排版4.14

寫電子郵件是有趣的,但不幸的是經常寫不好看,主要是因爲所有的行不一樣長,你的上司想要發排版精美的電子郵件,你的任務是爲他編寫一個電子郵件排版程序。

完成這個任務最簡單的辦法是在太短的行中的單詞之間插入空格,但這並不是最好的方法,考慮如下例子:

****************************

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 難看程度爲 0)

 

輸入

輸入文件第一行是一個整數N,表示該段要求達到的寬度,1<=N<=80。該段文章由一個或多個單詞組成,單詞由ASCII碼值爲33到126(包含33和126)的字符組成,單詞與單詞之間用空格隔開(可能超過一個)。單詞長度不會超過段落要求達到的寬度。一段文字所有單詞的總長度不會超過10000個字符,任何一行都不會超過100個字符,任何一個單詞都在同一行內。

 

輸出

對於每個段落,找出使其難看程度最小的排版形式並輸出句子:“Minimal badness is B.”,B是指按可能的最好排版形式會發生的難看程度值。注意排版後文本行數任意,多餘的空格也可刪除。

 

樣例

FORMAT.IN

28

This is the example you  are

actually considering.

 

FORMAT.OUT

Minimal badness is 12.


這是DP f[i]表示在第i個換行得到的最小的難看程度

#include<bits/stdc++.h>
#define int long long
#define N 1010
using namespace std;
int m,n,f[N],len[N];
char s[N];
inline int calc(int l,int r) {
	if(l==r) {
		if(len[r]-len[l-1]==m)
			return 0;
		return 500;
	}//一行只有一個的情況
	int oo=m-(len[r]-len[l-1]);//總共的空格數
	if(oo<(r-l))return 20021109;//空格不夠不存在這種情況,直接返回無限大
	int a=oo/(r-l);//a是直接分配每個得到的空格(要儘量平均分配)
	int b=oo-(r-l)*a;//b是分配後多出來的部分(b一定小於(r-l))
        a-=1;
	return 1LL*a*a*(r-l-b)+1LL*(a+1)*(a+1)*b;(好好推敲)
}
signed main() {
	int cnt=0;
//	freopen("format.in","r",stdin);
//	freopen("format.out","w",stdout);
	scanf("%d",&m);
	while(scanf("%s",s)!=EOF)
		len[++n]=strlen(s)+len[n-1];//前綴和
	for(int i=1; i<=n; i++)f[i]=20021109;
	f[0]=0;
	for(int i=1; i<=n; i++)
		for(int j=1; j<=i; j++)
			f[i]=min(f[i],f[j-1]+calc(j,i));
	printf("Minimal badness is %d.\n",f[n]);
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章