【題目描述】
亮亮成功地唸出了咒語,石門緩緩地自動移開,一道道絢麗的神光從城堡內激射而出。亮亮好奇而又興奮地走入了城堡中,迎面有一座極長的魔法陣。
魔法陣可以看作一條直線,它被均勻地分成了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。棋子是沒有區別的 跳動的規則很簡單,任意選一顆棋子,對一顆中軸棋子跳動。跳動後兩顆棋子距離不...