盜夢空間問題的解法

描述

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

 

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