BZOJ1563 詩人小G(1d1d動態規劃)

2021-08-01 22:25:00 字數 2732 閱讀 1913

小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,因此在這裡只要求輸出最小的不協調度。格式不變,依然以」-「分割。

4

4 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 −−

−−−−

−−−−

−−−−

−−−−

−−

【樣例說明】

前兩組輸入資料中每行的實際長度均為6,後兩組輸入資料每行的實際長度均為4。乙個排版方案中每行相鄰兩個句子之間的空格也算在這行的長度中(可參見樣例中第二組資料)。每行末尾沒有空格。

所有測試點中均滿足句子長度不超過30。

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進行排...