1. 程式人生 > >10.17(山東多校聯合模擬賽 day1)

10.17(山東多校聯合模擬賽 day1)

山東多校聯合模擬賽 day1

題不難

rect

【問題描述】

給出圓周上的 N 個點, 請你計算出以這些點中的任意四個為四個角,能構成多少個矩形。

點的座標是這樣描述的, 給定一個數組 v[1..N], 假設圓心為(0, 0), 圓的周長 C=∑v[1..N] , 第一個點座標為(0, C/(2π))。 從第一個點開始, 順時針沿圓周走 v1 個單位長度,此時座標為第二個點的座標,再走 v2 個單位長度,此時為第三個點的座標,當走完 v1, v2..vi個距離後,為第 i+1 個點的座標(全過程都是沿圓周順時針)。 特別的, 走完 v1, v2..vn 個距離後, 就會回到第一個點。

【輸入】

輸入檔名為 rect.in。

輸入共 N+1 行。

第一行為正整數 N。

接下來 N 行每行一個正整數。 其中第 i+1 行表示的是 v[i]。

【輸出】

輸出檔名為 rect.out。

輸出共 1 行,一個整數,表示能構成的矩形的個數。

【輸入樣例1】

8
1
2
2
3
1
1
3
3

【輸出樣例1】

3

【資料範圍】

對於 100%的資料,有 N<=20, V 陣列中的所有元素的值<=100。

【題解】

由於所有的點在圓上,所以可以處理出這些點能組成多少個直徑。最後答案為C(直徑數量,2)。由於N特別小,處理就是列舉端點即可。如果N是100萬,可以考慮維護兩個指標處理直徑。

ancestor

【問題描述】

任何一種生物的 DNA 都可以表示為一個由小寫英文字母組成的非空字串。科學家發現,所有的生物都有可能發生變異。所謂變,就是子代的 DNA 串與父代的 DNA 串有差異。每次變異, DNA 串中恰好有一個字元會變成兩個任意的字元。一共有 n 種可能的變異。變異 ai->bici 表示字元 ai 有可能變異為兩個字元 bici。詳細來說,就是刪掉一個字元 ai,之後在原來 ai 的位置處,插入 bi, ci 兩個字元(注意字元 bi 必須在 ci 的前面)。每種變異都有可能發生任意多次。可以發現,每變異一次, DNA 串的長度會加 1。

如果有一種生物 a,他的 DNA 串是 s1,另外存在一種生物 b,他的 DNA 串是 s2。如果 s2 可以通過若干次變異變為 s1,那麼生物 b 就被叫做生物 a 的祖先。

現在,給定一種生物,他的 DNA 串是 s。請找出他的一個祖先,且這個祖先的 DNA 串儘量短。

【輸入】

輸入檔案 ancestor.in,共 n+2 行。

第一行包含一個非空字串 s。

第二行含有一個整數 n,表示所有可能的變異。

接下來 n 行,每行描述一種可能的變異,按照 ai->bici 的格式。

s, ai, bi, ci 僅包含小寫英文字母。

請注意:一種變異可能出現多次。

【輸出】

輸出檔名為 ancestor.out。

輸出只有一行, 一個整數,表示祖先 DNA 串的最短長度。

【輸入樣例1】

ababa
2
c->ba
c->cc

【輸出樣例1】

2

【輸入樣例2】

ababa
7
c->ba
c->cc
e->ab
z->ea
b->ba
d->dd
d->ab

【輸出樣例2】

1

【資料範圍】

對於 30%的資料, s 的長度<=5, N <= 3;

對於 100%的資料, s 的長度<=50, N <= 50

【題解】

DP題。設f[l][r][t]代表區間[l,r]是否可以變成一個字母t,那麼初始狀態為f[i][i][t]=[s[i]==t]。列舉區間的長度和端點,對於一個區間,轉移的時候列舉中間點和所有變異即可。

再設一個fuck[l][r]代表[l,r]合併後的最短長度。根據上面的設定,當\(\exist\)f[l][r][t]=true時,fuck[l][r]=1,否則列舉中間點,fuck[l][r]為兩邊相加的最小值。

f1

【問題描述】

F1,中文全稱為一級方程式錦標賽,是最高階的方程式賽車比賽,現在你作為一名選手參加了一場 F1 的比賽,比較特殊地,本次比賽是在一個 N 個點 M 條邊的無向圖上舉行的。

起點是 S,終點是 T,每條邊長度為 1 公里,賽車每行駛 1 公里耗油 1 個單位,途中共有 k 個加油站, 每經過加油站時,可以把油加滿,但你的賽車設計顧問告訴你,油箱容量越大,賽車跑的就越慢。 為了追求最快的速度, 在能順利到達終點, 不會中途沒油的前提下,你希望最小化油箱的容量(注意,雖然油箱變小可能導致路徑變長,但我們只關心最小化的油箱)。

【輸入】

輸入檔案 f1.in。

第一行一個正整數 T 表示測試資料組數, 每組資料格式如下:

第一行三個整數, N,M,K,表示無向圖的點數,邊數,加油站數。

第二行 K 個正整數 i1,i2..ik 表示這些點上有加油站(可能重複,保證至少一個加油站在S 點)。

接下來 M 行,每行兩個正整數 Bi,Ei 表示有一條連線(Bi,Ei)的雙向邊(可能有重邊和自環)。

最後一行兩個正整數 S,T 表示起點、終點。

【輸出】

輸出檔名為 f1.out。

對於每組資料, 如果沒法到達終點,輸出-1,否則輸出最小化的油箱容量。

【輸入樣例】

2
6 6 3
1 3 6
1 2
2 3
4 2
5 6
4 5
3 4
1 6
7 10 3
1 3 4
1 2
4 2
7 5
4 5
7 1
2 5
7 2
3 7
3 2
5 1
4 6

【輸出樣例】

3
-1

【資料範圍】

對於 30%的資料, N<=200,M<=2000。

對於 60%的資料, N<=1000,M<=10000。

對於 100%的資料, 1<=K,S,T<=N<=100000,1<=M<=150000,1<=T<=5。

【題解】

由於答案是單調的(如果一個油箱容量合法,那麼所有比這個容量大的油箱都合法),那麼二分答案把題目轉化為判定性問題。從起點開始,設d[i]為某點的油箱的最大值,跑最短路即可。注意這裡必須使用spfa:下面的圖如果用dijkstra就會出問題

                [T]
                 |
                 |
                [.]
                 |
                 |
                 |
[S] --- [.] --- [.] --- [O]

ASCII藝術。。。如圖S是起點T是終點O是加油站,那麼當油箱容量為3的時候,需要在加油站中轉一下,這樣我們重複更新了拐彎處的點的油箱資訊。而dijkstra,bfs等演算法是不允許重複更新某個節點的,而spfa允許,所以需要使用spfa。關於SPFA他其實沒死,只是我們遇到最短路優先考慮dij更好。

ps昨天的題我自己厚顏無恥地從某網站扒的就不放了