欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

201709-2 公共钥匙盒

程序员文章站 2022-04-25 20:02:23
...
#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.放钥匙时,按钥匙号码从小到大的顺序进行归还;

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

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

相关标签: 日志