描述
《盜夢空間》是一部精彩的影片,在這部電影裏,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
分析:看到題的第一反應是遞歸,然後仔細想了想似乎不用遞歸藉助數組也能完成,所以最終是使用藉助數組來完成的。本題的關鍵就是如何完成在不同層次的夢境之間的時間轉化,分析不難得知,時間的轉化都是在相鄰層次夢境中進行的,而且都是從更深層次夢境向低層次夢境轉化。相鄰層次夢境之間的轉化比例爲20:1(在相同單位下從深層次夢境向低層次夢境轉化,所以第一層夢境向現實世界進行轉化時單位不同而導致比例不同 )。
******************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************
有大佬給我說了個問題,如果這些人輸入的數據最後Cobb他們沒有返回到現實世界,而是一直待在了夢境中間,(好像電影中結局就是這樣?)就會得到錯誤的結果,果然還是考慮的不夠周到,更新一下代碼。感謝大佬!!!
更改後的代碼:
#include<iostream>
#include<cmath>
using namespace std;
int main ( ) {
int T, n, ans, time;
scanf ( "%d", &T );
string action;
while ( T -- ) {
ans = 0;
int k = 1;
scanf ( "%d", &n );
while ( n -- ) {
cin >> action;
if ( action == "IN" ) {
k *= 20;
}
else if ( action == "OUT" ) {
k /= 20;
}
else if ( action == "STAY" ) {
scanf ( "%d", &time );
ans += time * 60 / k;
}
}
printf ( "%d\n", ans );
}
return 0;
}
這個是原來的 也留着吧 算是反思吧 ( 這個是!!!錯的 錯的 錯的!!!)
#include<iostream>
#include<string.h>
using namespace std;
int main ( )
{
int N, n, i, time, a[50] = { 0 }; /*數組 a 表示每次在對應層次夢境停留的時間 a[0] 表示現實世界的時間 a[1] 表示第一層夢境經歷的時間,以此類推。變量 i 表示夢境深度*/
char action[10];
cin >> N;
while ( N-- )
{
cin >> n;
i = 0;
while ( n -- )
{
cin >> action;
if ( strcmp ( action, "STAY" ) == 0 )
{
cin >> time;
a[i] += time; //停留在當前夢境,當前夢境經歷時間增加
}
if ( strcmp ( action, "IN" ) == 0 )
{
i ++; // IN 代表向下一層次夢境出發 i ++
}
if ( strcmp ( action, "OUT" ) == 0 )
{
if ( i - 1 )
{
a[i-1] += a[i] / 20; //深層次夢境與低層次夢境之間的轉化比例是20:1
}
else a[i-1] += a[i] * 3; /*因爲表示時間的單位不同,所以第一層夢境與現實世界的的轉化比例是1:3*/
a[i] = 0; //將本層次夢境停留時間置0
i --; //返回上一層夢境
}
}
cout << a[0] << endl;
a[0] = 0;
}
return 0;
}