盜夢空間
時間限制: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
此題主要是用map進行儲存,每次遇到IN就將層數加一,每次遇到OUT時就將層數減一,遇到STAY就將時間放入map中,注意map的鍵是層數,值是時間,
如果有相同的鍵不同的時間,則將時間累加
如果map中沒有鍵則將新的鍵值插入map中
注意每層的時間轉換是1/20,而且map具有自動按照鍵排序功能,故必須從map最後一個元素算起,不斷向上退出夢境,累加時間
#include <string> #include <vector> #include <iostream> #include <algorithm> #include <map> using namespace std; int main(){ int T; cin >> T; for(int icase = 0 ; icase < T; ++ icase ){ int m; cin >> m; string type; int cnt = 0; long long time = 0; map<int,long long> dream; for(int i = 0 ; i < m ; ++ i){ cin >> type; if(type == "IN") cnt ++; else if(type == "OUT")cnt --; else{ cin >> time; time *=60; map<int,long long>::iterator iter = dream.find(cnt); if(iter!=dream.end()) iter->second+=time; else dream.insert(make_pair(cnt,time)); } } long long res; int index ; bool first = true; for(map<int, long long>::reverse_iterator iter = dream.rbegin(); iter!=dream.rend(); ++ iter ){ if(first){ res = dream.rbegin()->second; index = dream.rbegin() -> first; first = false; }else{ res = res/20/(index-iter->first)+iter->second; index = iter->first; } } cout<<res/20/index<<endl; } }
此題遇到問題主要是c++中的map使用不熟悉,map進行反向迭代時要用reverse_iterator,進行查詢時要用map自身的find函式,不能用algorithm的查詢函式