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

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

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

----------------------------------------------------------------这是分割线------------------------------------------------------------------------------------------

以上为十月份第一次写,下面为复习第二次,独立完成,使用set;

以时间轴为考虑方向,数组的规模一次到位;

调试最长时间的bug:注意在第一次拿走归还以后,钥匙盒中的钥匙坐标和钥匙号码不对应,在下次拿走时需要重新从头寻找;

#include <iostream>
#include <set>
#include <vector> 
using namespace std;
const int N=1010;
struct teacher{
	int key;
	int start;
	int end;
}teach[N];
int sbox[N];
set <int> keybox;
int main(){
	int n,k;
	cin>>n>>k;
	for(int i=1;i<=n;i++){
		sbox[i]=i;
	}
	int min=100000,max=0;
	for(int i=0;i<k;i++){
		cin>>teach[i].key>>teach[i].start>>teach[i].end;
		teach[i].end+=teach[i].start;
		if(teach[i].start<min){
			min=teach[i].start;
		}
		if(teach[i].end>max){
			max=teach[i].end;
		}
	}
	for(int i=min;i<=max;i++){
		keybox.clear();
		for(int j=0;j<k;j++){
			if(teach[j].end==i){
				keybox.insert(teach[j].key); 
			}
		}
		if(!keybox.empty()){
			for(set <int>::iterator it=keybox.begin();it!=keybox.end();it++){
				for(int j=1;j<=n;j++){
					if(sbox[j]==0){
						sbox[j]=*it;
						break;
					}
				}
			}
		}
		for(int j=0;j<k;j++){
				if(teach[j].start==i){
					for(int d=1;d<=n;d++){
						if(sbox[d]==teach[j].key){
							 sbox[d]=0;
							 break;
						}
				}
			}
		}
	}
	for(int i=1;i<=n;i++){
		cout<<sbox[i]<<" ";
	}
	return 0;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值