標籤:開始 default animate mil pre block 大量 icon 輸出
2823 鎖妖塔
時間限制: 1 s 空間限制: 128000 KB 題目等級 : 黃金 Gold
題目描述 Description
瑣妖塔會在一會兒後倒塌。大量妖魔湧出塔去,塔內的樓梯都擠滿了人(哦,錯了,是妖),(那他們怎麼不飛下去--)要求是,景天一行一定要下塔,瑣妖塔一共N層,但是他突然大發慈悲,覺得妖怪是無辜,所以他不想踩死這些妖魔,所以他的速度最多比妖怪速度大K(否則會踩死妖怪的),並且速度不能比妖怪們慢,否則會被踩死。瑣妖塔一共有N層,並且每層怪物逃跑的速度都不相同,景天每下一層,可以選擇將他的速度加快一個單位或者減慢一個單位或者保持原來的速度不變。並且他下每一層的速度之和除以(N-1)要盡量大。當然跑下樓時他一定要活著。
現在景天剛拿到鎮妖劍,頭有點熱,不能思考了,請你編個程式幫幫他吧!
提示:1樓不需要再下了,N層樓只需要下N-1層。並且在第N層樓到N-1層時必須為初始速度。
輸入描述 Input Description
第一行,三個整數N,V(初始速度),K(最多比其他妖快的速度值)
第二行,N-1個整數,分別代表從第二層到第N層的妖怪的速度
其中2〈=N〈=100,0〈=K〈=100,1〈=V〈=100。
輸出描述 Output Description
若能下樓,輸出速度之和除以(N-1),保留兩位小數。
若不能,那就仰天大吼一聲,輸出“REN JIU SHI BU NENG REN CI!”(不含引號)
範例輸入 Sample Input
Input1
3 3 2
2 2
Input2
3 3 0
2 2
範例輸出 Sample Output
Output1
3.50
Output2
REN JIU SHI BU NENG REN CI!
資料範圍及提示 Data Size & Hint
RT
1 #include<cstdio> 2 #include<queue> 3 #include<algorithm> 4 using namespace std; 5 typedef double db; 6 int n,v,k; 7 struct meico{ 8 int v; 9 int ceng;10 int tot;11 };12 db ans=0;13 const int maxn=1000;14 int spd[maxn],cg[]={0,1,0,-1},maxs[maxn];15 bool flag;16 void dfs(int vv,int ceng,int tot){17 if(ceng==1){18 flag=1;ans=max(ans,(db)((db)(tot)/db(n-1)));19 return ;20 }21 if(flag) return;22 for(int i=1;i<=3;i++){23 int v1=vv+cg[i];24 if(vv>=spd[ceng-1]&&(vv-spd[ceng-1])<=k){25 if(ceng-1!=1)26 dfs(v1,ceng-1,tot+v1);27 else dfs(v1,ceng-1,tot);28 }29 }30 }31 int main()32 {33 scanf("%d%d%d",&n,&v,&k);34 for(int i=1;i<n;i++)35 scanf("%d",&spd[i]);36 37 if(v>=spd[n-1]&&v-spd[n-1]<=k){38 dfs(v,n,v);39 if(ans!=0)40 printf("%.2lf\n",ans);41 else printf("REN JIU SHI BU NENG REN CI!"); 42 }43 else{44 printf("REN JIU SHI BU NENG REN CI!");45 return 0;46 }47 48 return 0;49 }
剛開始一見這題,仙劍奇俠傳!!!!!夢幻西遊!!!!!!!鬼吹燈!!!!!!!!
由於題目下面寫的寬搜,於是我一開始就打了寬搜….結果3^100直接MLE。
所以用深搜。
這題我們枚舉下樓的情況時,把速度+1放在最前面,這樣能減掉不少枝,當搜到第一層的時候,更新答案,然後如果後面的最優答案小於當前最優答案,就減掉。
COdevs 2823 鎖妖塔