公共钥匙盒
#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;
}