小g是乙個出色的詩人,經常作詩自娛自樂。但是,他一直被一件事情所困擾,那就是詩的排版問題。一首詩包含了若干個句子,對於一些連續的短句,可以將它們用空格隔開並放在一行中,注意一行中可以放的句子數目是沒有限制的。小g給每首詩定義了乙個行標準長度(行的長度為一行中符號的總個數),他希望排版後每行的長度都和行標準長度相差不遠。顯然排版時,不應改變原有的句子順序,並且小g不允許把乙個句子分在兩行或者更多的行內。在滿足上面兩個條件的情況下,小g對於排版中的每行定義了乙個不協調度, 為這行的實際長度與行標準長度差值絕對值的p次方,而乙個排版的不協調度為所有行不協調度的總和。
小g最近又作了幾首詩,現在請你對這首詩進行排版,使得排版後的詩盡量協調(即不協調度盡量小),並把排版的結果告訴他。
本題中包含多組測試資料。輸入檔案中的第一行為乙個整數t,表示詩的數量。
接下來為t首詩,這裡一首詩即為一組測試資料。每組測試資料中的第一行為三個由空格分隔的正整數n,l,p,其中:n表示這首詩句子的數目,l表示這首詩的行標準長度,p的含義見問題描述。
從第二行開始,每行為乙個句子,句子由英文本母、數字、標點符號等符號組成(ascii碼33~127,但不包含』-『)。
對於每組測試資料,若最小的不協調度不超過10^18,則第一行為乙個數,表示不協調度。接下來若干行,表示你排版之後的詩。注意:在同一行的相鄰兩個句子之間需要用乙個空格分開。如果有多個可行解,它們的不協調度都是最小值,則輸出任意乙個解均可。若最小的不協調度超過10^18,則輸出「too hard to arrange」(不含引號)。每組測試資料結束後輸出「——————–」(不含引號),共20個「-」,「-」的ascii碼為45,請勿輸出多餘的空行或者空格。
由於缺少special judge,因此在這裡只要求輸出最小的不協調度。格式不變,依然以」-「分割。
44 9 3
brysj,
hhrhl.
yqqlm,
gsycl.
4 9 2
brysj,
hhrhl.
yqqlm,
gsycl.
1 1005 6
poet
1 1004 6
poet
108 −−−−−−
−−−−
−−−−
−−−−
−−32 −−
−−−−
−−−−
−−−−
−−−−
−−too hard to arrange −−
−−−−
−−−−
−−−−
−−−−
−−1000000000000000000 −−
−−−−
−−−−
−−−−
−−−−
−−
【樣例說明】30分演算法:前兩組輸入資料中每行的實際長度均為6,後兩組輸入資料每行的實際長度均為4。乙個排版方案中每行相鄰兩個句子之間的空格也算在這行的長度中(可參見樣例中第二組資料)。每行末尾沒有空格。
所有測試點中均滿足句子長度不超過30。
1,2,3組資料:樸素動態規劃,轉移方程: f[
i]=m
in(f
[j]+
|s[i
]−s[
j]+i
−j−1
−l|p
)。100分演算法:
既然直接dp只有30分,那麼我們該想如何進行優化。
我們可以看出這是乙個1d1d動態規劃,那麼決策區間就是連續的段落,於是我們維護乙個上凸殼,每次更新的時候用二分就好了,注意也要用佇列來優化。
注意資料比較大,用long double 算完轉long long輸出。
#include
#include
#include
#include
typedef
long
double ll;
#define inf 9000000000000000000
#define max 1000000000000000000ll
using
namespace
std;
int t,n,l,p,top;
ll sum[100005],f[100005],from[100005];
char ch[100005][35];
struct nod
nod(int a,int b,int c):l(a),r(b),p(c){}
}q[100005];
inline ll read()
return x;
}inline ll pow(ll x)
inline ll cal(int j,int i)
int find(nod a,int b)
return l;
}void dp() }}
}int main()
return
0;}
156 合併區間
5.3 本來以為是排好序的區間,後來發現不是。definition of interval public class interval class solution for int i 0 i intervals.size 1 i if tmp1.start tmp2.end tmp1.start ...
1 5 6 泛型方法
除了定義泛型類,泛型結構外,還可以定義泛型放啊發,泛型方法可以在泛型型別定義 也可以在非泛型類中定義。下面是定義的乙個泛型方法,該泛型型別用於兩個引數。前面有介紹ref關鍵字 void swap ref t x,ref t y 通過傳入型別來呼叫泛型類 int i 4 int j 5 swap re...
lintcode練習 156 合併區間
給出若干閉合區間,合併所有重疊的部分。您在真實的面試中是否遇到過這個題?是 given intervals merged intervals 1,3 1,6 2,6 8,10 8,10 15,18 15,18 o n log n 的時間和 o 1 的額外空間。實現 思路 先對列表按照start進行排...