1. 程式人生 > >201709-2 公共鑰匙盒

201709-2 公共鑰匙盒

#include <iostream> 
#include <vector>
#include <set>
#include <vector>
using namespace std;
const int N=10101;
const int M=1010;
set<int> back[N];
vector<int> take[N];
int keybox[M];
int main(){
	int n=0,k=0,end=0;
	cin>>n>>k;
	for(int i=1;i<=n;i++){
		keybox[i]=i;
	}
	int w=0,s=0,c=0;
	for(int i=0;i<k;i++){
		cin>>w>>s>>c;
		take[s].push_back(w);
		back[s+c].insert(w);
		if((s+c)>end){
			end=s+c;
		}
	}
	set<int>::iterator it;
	for(int i=0;i!=end+1;i++){
		for(it=back[i].begin();it!=back[i].end();it++){
			for(int j=1;j<=n;j++){
				if(keybox[j]==0){
					keybox[j]=*it;
					break;
				}
			}
		}
		for(int d=0;d!=take[i].size();d++){
			for(int j=1;j<=n;j++){
				if(keybox[j]==take[i][d]){
					keybox[j]=0;
					break;
				}	
			}
		} 	
	}
	for(int i=1;i<=n;i++){
		cout<<keybox[i]<<" ";
	}
	cout<<endl;
	return 0;
}

剛開始用陣列和結構體進行考慮和儲存,一直在進行糾結放和取的關係,沒有捋清楚迴圈的條件;

看到別人的思路才開始嘗試用set進行寫;

考慮點1.按時間線進行考慮;

           2.同一時間點,先把鑰匙放下才能取;

           3.放鑰匙時,按鑰匙號碼從小到大的順序進行歸還;

注意點:資料的儲存,從時間線開始,每一個節點都對取表和存表進行判斷,有資料進一步動作,沒有則向後執行;

題目的用例規模要考慮(出現執行錯誤的提示很大可能錯誤在與陣列的規模和題目要求不符合)!!!!