2014百度之星資格賽 1001-Energy Conversion

Energy Conversion

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 7140    Accepted Submission(s): 1715


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
 
 
 
    這道題太坑了,我就不明白了10^8 次方 int就是解決不了!!!後來我改成long long xxx也錯!!!! 最後改成__int64才AC成功。。。
我都無奈了,這道題又不考查什麼知識點,精度問題耗費我n長時間!!!!!
    百度後:(M-V)*K 結果可能超出 int 範圍,所以每個數用 long long 類型,注意輸入輸出的時候要使用 "I64d"。
 
/***********************************
*
*   acm: 2014百度之星資格賽-1001
*
*   title: Energy Conversion
*
*   time : 2014.5.7
*
***********************************/
#include <stdio.h>
#include <stdlib.h>

#define ll __int64

int main()
{
    int T;
    int i = 0;

    scanf("%d", &T);

    while (i < T)
    {
        ll N; //需要的能量值,開啓大門
        ll M; //現在本身擁有的能量值
        ll V; //轉換能量的需要耗費的基值
        ll K, A; //(A - V)*K //A表示當前能量值,K是擴大的倍數

        ll n = 0; //幾次才能轉換完畢
        int flag = -1;//判斷是否能轉換(即是否有解)

        scanf("%I64d%I64d%I64d%I64d", &N, &M, &V, &K);
        A = M;

        if (A >= N)
        {
            flag = 0;
        }
        else if ((A-V)*K <= A)  //隱含A<N
        {
            flag = -1;
        }
        else  //A < N and 有解 (A-V)*K > A
        {
            flag = 0;

            while (A < N)
            {
                A = (A-V)*K;
                n++;
            }
        }


        if (flag == -1)
        {
            printf("%d\n", flag);
        }
        else
        {
            printf("%I64d\n", n);
        }

        i++;

    }

    return 0;
}

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