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.放钥匙时,按钥匙号码从小到大的顺序进行归还;

注意点:数据的存储,从时间线开始,每一个节点都对取表和存表进行判断,有数据进一步动作,没有则向后执行;

题目的用例规模要考虑(出现运行错误的提示很大可能错误在与数组的规模和题目要求不符合)!!!!

猜你喜欢

转载自blog.csdn.net/qq_42261362/article/details/83450602
今日推荐