模擬題 二分 動態規劃 神光

2021-10-09 23:34:51 字數 3258 閱讀 4518

【題目描述】

亮亮成功地唸出了咒語,石門緩緩地自動移開,一道道絢麗的神光從城堡內激射而出。亮亮好奇而又興奮地走入了城堡中,迎面有一座極長的魔法陣。

魔法陣可以看作一條直線,它被均勻地分成了1000000000

1 000 000 000

100000

0000

個位置,乙個位置可以看成是乙個格仔。有些位置上築有法壇,一共n

nn座。亮亮只有破了眼前的魔法陣,才能繼續前進,而欲破法陣,必須毀掉所有的法壇。

亮亮身前有兩根法杖:一根顏色血紅,能發紅色神光,光芒可以籠罩連續l

ll個位置,並摧毀這l

ll個位置上所有的法壇,最多使用r

rr次;另一根顏色碧綠,能發綠色神光,光芒可以籠罩連續2l2l

2l個位置,並摧毀這2l2l

2l個位置上所有的法壇,最多使用g

gg次。

法杖的神奇之處在於,l

ll的值必須由亮亮事先設定好,並且一經設定,便無法更改。亮亮需要在規定的次數下摧毀所有法壇,並且使得l

ll最小。

【輸入格式】

第一行三個整數n,r

,g

n, r, g

n,r,

g。 第i(2

<=i

<=n

+1

)i (2<=i<=n+1)

i(2<=i

<=n

+1) 行乙個整數aiai

ai,表示第i

ii座法壇的位置。

【輸出格式】

只有乙個整數,表示l

ll的最小值。

【樣例輸入】

3 1 1

2217

【樣例輸出】

4
【樣例解釋】

亮亮將l

ll設為4

44,並用紅色神光籠罩21−24

21-24

21−2

4位置,用綠色神光籠罩1−8

1-81−

8位置。

【資料規模】

對於50

%50\%

50%的資料,n

<

=100

n <= 100

n<=1

00;對於100

%100\%

100%

的資料,1

<=n

<

=2000,1

<=r

,g,a

i<=1

,000

,000

,000

1 <= n <= 2000,1 <= r, g, ai <= 1,000,000,000

1<=n

<=2

000,

1<=r

,g,a

i<=1

,000

,000

,000

。這就二分啊!!十分明顯的二分啊!!

然後二分模板打好了,怎麼寫che

ck

check

chec

k函式呢……不會寫。

所以貼一波官方題解。

(居然是動歸,狀態轉移方程根本想不到好吧。)

演算法:首先我們注意到,當r

rr和g

gg的大小超過了n

nn時,l

ll的最小值就是1

11,因此,我們只需要考慮r

rr和g

gg小於n

nn的情況,於是r,g

r,gr,

g的規模就降到了2000

2000

2000

以內。顯然要採用二分答案的方法。那麼問題轉化為,判斷給定的l

ll能否摧毀所有法壇,我們採用動態規劃方法。

首先將法壇的位置按照從小到大進行排序。

令d p[

i][j

]dp[i][j]

dp[i][

j]表示,在用了i

ii次紅光,j

jj次綠光的情況下,最多從第一座法壇開始,一直摧毀到第幾座法壇。那麼狀態轉移方程即為dp[

i][j

]=

max⁡(p

[dp[

i−1]

[j]+

1],q

[dp[

i][j

−1]+

1]

)dp[i][j]=\max ( p[dp[i-1][j] + 1], q[dp[i][j-1] + 1] )

dp[i][

j]=max(p

[dp[

i−1]

[j]+

1],q

[dp[

i][j

−1]+

1])。

其中p [k

]p[k]

p[k]

表示使用一次紅光, 能從第k

kk座法壇向右(正向為右)連續摧毀到第幾座,q[k

]q[k]

q[k]

表示使用一次綠光,能從第k

kk座法壇向右連續摧毀到第幾座。

p

pp和q

qq陣列可以通過預處理得到。最終,我們只要判斷dp[

r][g

]dp[r][g]

dp[r][

g]的值是否為n

nn即可。

時間複雜度:o(n

2)

o(n^2)

o(n2)

期望得分:100

10010

0 **如下:

#include#define n 2000+10

using namespace std;

int n,r,g;

int a[n];

int id1[n],id2[n];

int f[n][n];

bool check(int l)

if(f[r][g]==n)return true;

else return false;

}int main()

for(int i=1;i<=n;i++)

scanf("%d",&a[i]);

sort(a+1,a+n+1);

int l=1,r=1e9;

while(l>1;

if(check(mid))r=mid;

else l=mid+1; }

printf("%d",l);

return 0;

}

動態規劃 二分 奧運大包圍

題目描述 為了迎接奧運,市體育局舉行手拉手大包圍活動,開始時n個人手拉手圍成乙個圈。後來這些人中的一些按順序向裡面出圈形成乙個新圈。從而使原圈形成乙個從高到低,最低與最高連線的圈。新圈重複相同的操作,直到沒有人要出圈為止。問最少要形成多少個這樣的圈。輸入 第一行n個人,第二行輸入n個人的身高 每個身...

動態規劃 最優二分檢索樹

最優二分檢索樹 最優二分檢索樹問題 求一棵使得預期成本最小的二分檢索樹 或是一棵空樹 或者是具有如下性質的非空二叉樹 1 左子樹的所有結點均小於根的值 2 右子樹的所有結點均大於根的值 對於乙個給定的識別符號集合,可能有若干棵不同的二分檢索樹 不同形態的二分檢索樹對識別符號的檢索效能是不同的。設給定...

bzoj 2144 二分 lca 神題詳解

題目 跳跳棋是在一條數軸上進行的。棋子只能擺在整點上。每個點不能擺超過乙個棋子。我們用跳跳棋來做乙個簡單的遊戲 棋盤上有3顆棋子,分別在a,b,c這三個位置。我們要通過最少的跳動把他們的位置移動成x,y,z。棋子是沒有區別的 跳動的規則很簡單,任意選一顆棋子,對一顆中軸棋子跳動。跳動後兩顆棋子距離不...