1. 程式人生 > >ccf認證 201709-2

ccf認證 201709-2

這道題寫了很久,無腦做題啊啊啊啊,總結一下心得。

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;
}