2014百度之星資格賽第一題

週末2天沒事,參加了一下今年百度之星的資格賽。剛開始還以爲資格賽會很簡單,做了之後,發現還是很有難度。現把自己做的貼出來。(比賽結束了,應該可以放到網上了!)

題目:

Problem Description
  魔法師百小度也有遇到難題的時候——
  現在,百小度正在一個古老的石門面前,石門上有一段古老的魔法文字,讀懂這種魔法文字需要耗費大量的能量和大量的腦力。
  過了許久,百小度終於讀懂魔法文字的含義:石門裏面有一個石盤,魔法師需要通過魔法將這個石盤旋轉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^8
Output
  對於每組數據,請輸出最少做幾次能量轉換才能夠有足夠的能量點開門;
  如果無法做到,請直接輸出-1。
Sample Input
4
10 3 1 2
10 2 1 2
10 9 7 3
10 10 10000 0
Sample Output
3
-1
-1
0

            這是資格賽中最簡單的一道題目了,也確實不難。但是這道題要注意M,N,V.K<10^8,這四個數本身取值範圍是在int表達範圍內,但是相乘之後有可能超出Int所表達的範圍。所以該題目表達N,M,V,K的類型用的是LONG LONG類型。這就是這題的難點。代碼如下:已通過了測試平臺。

#include<iostream>
#include<stdio.h>
using namespace std;
long long fun(long long n,long long m,long long v,long long k)
{
    if(n<=m)
        return 0;
    if((m-v)*k<=m||k<0||m<0)
        return -1;
    long long temp=m;
    long long count=0;
    while(temp<n)
    {
        temp=(temp-v)*k;
        count++;
    }
    return count;
}
int main()
{
    int t;
    long long m,n,v,k;
    //freopen("b.txt","r",stdin);
    cin>>t;
    while(t-->0)
    {
       cin>>n>>m>>v>>k;
       cout<<fun(n,m,v,k)<<endl;
    }
    return 0;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章