盜夢空間
- 描述
《盜夢空間》是一部精彩的影片,在這部電影裏,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;
}