nyoj 125 盜夢空間

盜夢空間

時間限制:3000 ms  |  內存限制:65535 KB
難度:2
描述

《盜夢空間》是一部精彩的影片,在這部電影裏,Cobb等人可以進入夢境之中,夢境裏的時間會比現實中的時間過得快得多,這裏假設現實中的3分鐘,在夢裏就是1小時。

然而,Cobb他們利用強效鎮靜劑,可以從第一層夢境進入第二層夢境,甚至進入三層,四層夢境,每層夢境都會產生同樣的時間加速效果。那麼現在給你Cobb在各層夢境中經歷的時間,你能算出現實世界過了多長時間嗎?

比如,Cobb先在第一層夢境待了1個小時,又在第二層夢境裏待了1天,之後,返回第一層夢境之後立刻返回了現實。

那麼在現實世界裏,其實過了396秒(6.6分鐘)

輸入
第一行輸入一個整數T(0<=T<=100),表示測試數據的組數。
每組測試數據的第一行是一個數字M(3<=M<=100)
隨後的M行每行的開頭是一個字符串,該字符串如果是"IN" 則Cobb向更深層的夢境出發了,如果是字符串"OUT"則表示Cobb從深層的夢迴到了上一層。如果是首字符串是"STAY"則表示Cobb在該層夢境中停留了一段時間,本行隨後將是一個整數S表示在該層停留了S分鐘(1<=S<=10000000)。數據保證在現實世界中,時間過了整數秒。
輸出
對於每組測試數據,輸出現實世界過的時間(以秒爲單位)。
樣例輸入
1
6
IN
STAY 60
IN
STAY 1440
OUT
OUT
樣例輸出
396

題目思路:現實3分鐘,夢境裏1小時,即在夢境20分鐘,在現實中1分鐘。在夢境第一層待了1小時,即在現實中60*60/20秒,又在第二層待了24小時,遞推得在第一層的時間是1440*60/20秒,在現實中的時間是1440*60/20/20秒,即216秒,所以總時間爲180+216=396秒。

最優代碼:

#include<iostream>
#include<string>
using namespace std;
int main()
{
    int t,m;
    string s;
    cin>>t;
    while(t--)
    {
        int p=1,time,times=0;
        cin>>m;
        while(m--)
        {
            cin>>s;
            if(s=="IN")
                p*=20;                 //向上一層乘以20
            else if(s=="STAY")
            {
                cin>>time;
                times+=time*60/p;
            }
            else p/=20;              //返回一層除以20
        }
        cout<<times<<endl;
    }
    return 0;
}

自己寫的代碼:

#include<iostream>
#include<string>
#include<cstring>
using namespace std;
typedef struct
{
    double y;
    int s;                               //s代表在第幾層夢境
}stay;
int main()
{
    stay b[1000];
    int t,m,i,s=0,k=0;
    double time=0,h=0;
    string a;
    cin>>t;
    while(t--)
    {
        cin>>m;
        s=0;
        k=0;
        for(i=0;i<m;i++)
        {
            cin>>a;
            if(a=="IN")
            {
                s++;                      //輸入IN層數加1
                continue;
            }
            else if(a=="STAY")
            {
                cin>>b[k].y;
                b[k].s=s;
                k++;                       //k代表輸入了幾次時間
            }
            else
            {
                s--;                      //輸入OUT層數減1
                continue;
            }
        }
        time=0;
        h=0;
        for(i=0;i<k;i++)
        {
            while(b[i].s--)                //相當於一個遞歸,計算回到現實中的時間
                b[i].y=((b[i].y)/60)*3;
            time+=b[i].y;                   //計算時間和
        }
        cout<<time*60<<endl;
    }
    return  0;
}

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