ACM 盜夢空間

OpenSoucre發表於2014-04-06

盜夢空間

時間限制: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的查詢函式

map的用法參見http://www.cplusplus.com/reference/map/map/?kw=map

相關文章