2013程式設計之美挑戰賽 無盡的編號

2021-06-16 21:05:04 字數 1335 閱讀 4754

description

在一條公路上,將要依次建造n座建築。在每個建築建成之後,都會用乙個01串來給它編號。整條公路從起點到終點,所有建築的編號都嚴格按照字典序遞增的順序來排列,而每在乙個新的地方建起乙個建築時,它的編號會按以下規則確定:

1) 編號要比前乙個建築(起點方向)的字典序大,比後乙個建築(終點方向)的字典序小

3) 編號一定以1結尾

2) 編號要盡可能短,滿足該條件時,字典序盡可能小

最開始時,公路的起點和終點上各有乙個建築,編號分別是0和1。接下來依次給出n個座標 a1, a2, ..., an,依次表示下乙個建築將要建造的位置,最後要問,當所有建築建成時,這些建築的編號總長度是多少,其中又出現了多少個字元1。所有建築都在公路起點和終點之間,並且沒有兩個建築建在同乙個位置。

input

輸入檔案包含多組測試資料。

第一行,給出乙個整數t,為資料組數。接下來依次給出每組測試資料。

每組資料中第一行為乙個整數 n,表示將要建造的建築數量,第二行是用單個空格隔開的n個互不相同的整數 a

1, a

2, ..., a

n,表示依次將要建造的建築所在的座標。

小資料:t ≤ 100, 0 < n ≤ 100, 0 ≤ a

i ≤ 1000

大資料:t ≤ 10, 0 < n ≤ 50000, 0 ≤ a

i ≤ 500000​

output

對於每組測試資料,輸出一行"case #x: y z",其中x表示測試資料編號,y表示所有建築編號總長,z表示所有編號中字元1的數量。所有建築包括起點和終點的這兩個建築。所有資料按讀入順序從1開始編號。

sample input

1

51 2 3 4 5

sample output

case #1: 22 16
解題思路

我們簡單畫幾個樣例來模擬一下規則,就可以看出其中的規律了。首先,考慮新建築的編號的長度,它一定比相鄰兩個編號更長,再根據編號規則可以知道,它的長度一定是相鄰編號長度較大值+1。其次,考慮新編號中1的個數,它總是恰好等於左邊建築的1的數量+1。找到這兩個規律之後,我們便可以通過模擬來得到每個建築的編號長度和其中1的個數。

**參考rank 2的 猛獁也鑽地 -大神也。
#include #include #include #include #include #include using namespace std;

typedef pairpii;

int main()

cout<<"case #"<

2013程式設計之美挑戰賽 集會

description 在一條河的一側,分布著 n 個村莊。這些村莊平日裡需要一些 往來,然而商人們來回走遍每一座村莊是非常辛苦的,於是他們決定每個月都在河邊舉行一次集會,大家都來集會上購買需要的物品。然而在集會地點的選擇上,大家卻有分歧,因為誰都不願意集會的地點離自己村莊非常遠。經過一番激烈的討論...

2013程式設計之美全國挑戰賽

description alice和bob都要向同乙個商人購買鑽石。商人手中有 n 顆鑽石,他會將它們一顆顆地賣給他們,alice和bob通過競價的方式來決定鑽石的歸屬。具體的過程如下 商人首先指定其中乙個人開始 之後兩人輪流 要求是一定要比對方報的 更高。任何時候,如果乙個人不願出價或者出不起價錢...

2013程式設計之美全國挑戰賽

description 對於兩個長度相等的字串,我們定義其距離為對應位置不同的字元數量,同時我們認為距離越近的字串越相似。例如,0123 和 0000 的距離為 3,0123 和 0213 的距離則為 2,所以與 0000 相比,0213 和 0123 最相似。現在給定兩個字串 s1 和 s2,其中...