ccf認證 201709-2
阿新 • • 發佈:2018-12-11
這道題寫了很久,無腦做題啊啊啊啊,總結一下心得。
1. 題目提到老師還鑰匙不是放在原來的位置上,而是儘量靠前放。說明這個順序是不定的,而鉤子是固定的,所以這裡要處理一下。
2. 必須正確模擬出放鑰匙和還鑰匙這兩個動作。這裡取資料鉤子存放點設為-1,還鑰匙則是恢復資料。
3. 求出存,取鑰匙的各時間點。遍歷時間進行操作。
4. set是自動升序排序的,map預設按照key值升序排序。
程式:
#include <iostream> #include <string> #include <set> #include <map> #include <algorithm> using namespace std; int main(){ int N,K; cin >> N >> K; int temp; set<int> times; map<int,int> returns; int seat[N+1]; int * * teacher = new int*[K]; for(int i=0;i<K;i++) teacher[i] = new int[3]; for(int i=0;i<K;i++) for(int j=0;j<3;j++) cin >> teacher[i][j]; for(int i=0;i<=N;i++){ seat[i] = i; } for(int i=0;i<K;i++){ times.insert(teacher[i][1]); temp = teacher[i][1]+teacher[i][2]; times.insert(temp); } for(set<int>::iterator iter = times.begin();iter != times.end();iter++){ //遍歷老師們,檢視是否有老師在此刻還鑰匙 // cout << *iter << " "; for(int i = 0;i < K;i++){ // cout << (teacher[i][2] + teacher[i][1]) <<"#"; if((teacher[i][2] + teacher[i][1]) == *iter ){ returns[teacher[i][0]] = teacher[i][2]; } } if(!returns.empty()){ for(map<int,int>::iterator iter1 = returns.begin();iter1 != returns.end();iter1++){ // cout << iter1->first << " "; for(int i=1;i<=N;i++) if(seat[i] == -1){ seat[i] = iter1->first; break; } } returns.clear(); // cout << "\n"; } // cout << "\n"; //借鑰匙 for(int i = 0;i < K;i++){ if(teacher[i][1] == *iter) for(int j=1;j<=N;j++) if(seat[j] == teacher[i][0]){ seat[j] = -1; break; } } } for(int i=1;i<N+1;i++){ cout << seat[i] << " "; } for(int i=0;i<K;i++) delete []teacher[i]; delete [] teacher; return 0; }