標籤:
題目連結:HDU - 4823
魔法師百小度也有遇到難題的時候——
現在,百小度正在一個古老的石門面前,石門上有一段古老的魔法文字,讀懂這種魔法文字需要耗費大量的能量和大量的腦力。
過了許久,百小度終於讀懂魔法文字的含義:石門裡面有一個石盤,魔法師需要通過魔法將這個石盤旋轉X度,以使上面的刻紋與天相對應,才能開啟石門。
但是,旋轉石盤需要N點能量值,而為瞭解讀密文,百小度的能量值只剩M點了!破壞石門是不可能的,因為那將需要更多的能量。不過,幸運的是,作為魔法師的百小度可以耗費V點能量,使得自己的能量變為現在剩餘能量的K倍(魔法師的世界你永遠不懂,誰也不知道他是怎麼做到的)。比如,現在百小度有A點能量,那麼他可以使自己的能量變為(A-V)*K點(能量在任何時候都不可以為負,即:如果A小於V的話,就不能夠執行轉換)。
然而,在解讀密文的過程中,百小度預支了他的智商,所以他現在不知道自己是否能夠旋轉石盤,開啟石門,你能幫幫他嗎
Input輸入資料第一行是一個整數T,表示包含T組測試範例;
接下來是T行資料,每行有4個自然數N,M,V,K(字元含義見題目描述);
資料範圍:
T<=100
N,M,V,K <= 10^8Output
對於每組資料,請輸出最少做幾次能量轉換才能夠有足夠的能量點開門;
如果無法做到,請直接輸出-1。
題意描述:中文題目,如上所述。
演算法分析:這是2014年百度之星的資格賽的一道水題,直接做,沒什麼演算法而言。
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<cstdlib> 5 #include<cmath> 6 #include<algorithm> 7 #define inf 0x7fffffff 8 using namespace std; 9 typedef long long LL;10 11 LL n,m,v,k;12 13 int main()14 {15 int t;16 scanf("%d",&t);17 while (t--)18 {19 scanf("%I64d%I64d%I64d%I64d",&n,&m,&v,&k);20 if (m>=n) {printf("0\n");continue; }21 if (m<=v) {printf("-1\n");continue; }22 int cnt=0,flag=0;23 while (m<n)24 {25 int a=m;26 m=(m-v)*k;27 cnt ++ ;28 if (m==a || m<=v) {flag=1;printf("-1\n");break; }29 }30 if (!flag) printf("%d\n",cnt);31 }32 return 0;33 }
hdu 4823 Energy Conversion 構造