试题编号: | 201709-2 |
试题名称: | 公共钥匙盒 |
时间限制: | 1.0s |
内存限制: | 256.0MB |
问题描述: | 问题描述 有一个学校的老师共用N个教室,按照规定,所有的钥匙都必须放在公共钥匙盒里,老师不能带钥匙回家。每次老师上课前,都从公共钥匙盒里找到自己上课的教室的钥匙去开门,上完课后,再将钥匙放回到钥匙盒中。 输入格式 输入的第一行包含两个整数N, K。 输出格式 输出一行,包含N个整数,相邻整数间用一个空格分隔,依次表示每个挂钩上挂的钥匙编号。 样例输入 5 2 样例输出 1 4 3 2 5 样例说明 第一位老师从时刻3开始使用4号教室的钥匙,使用3单位时间,所以在时刻6还钥匙。第二位老师从时刻2开始使用钥匙,使用7单位时间,所以在时刻9还钥匙。 样例输入 5 7 样例输出 1 2 3 5 4 评测用例规模与约定 对于30%的评测用例,1 ≤ N, K ≤ 10, 1 ≤ w ≤ N, 1 ≤ s, c ≤ 30; |
这道题重点在于多人放回钥匙的情况以及同时有人取和放回的情况。我感觉我的办法不是很好,是对时间轴 time[ ] 上的每个点的vector进行遍历,先把所有需要放回的钥匙进行排序,然后依次放回。对所有放回操作处理完毕后,如果还有取钥匙的操作,再进行处理。
#include<stdio.h>
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
int key[1005];
struct Time{
int op;//0取,1放
int num;//钥匙编号
};
vector<struct Time> time[11000];
int main(){
int N,K,w,s,c,i,j,k,final=0;
scanf("%d%d",&N,&K);
for(i=1;i<=N;i++){
key[i]=i;
}
for(i=1;i<=K;i++){
scanf("%d%d%d",&w,&s,&c);
struct Time t1,t2;
t1.op=0;t1.num=w;time[s].push_back(t1);
t2.op=1;t2.num=w;time[s+c].push_back(t2);
if(s+c>final) final = s+c;
}
for(i=1;i<=final;i++){
int count=0,back[time[i].size()];
for(k=0;k<time[i].size();k++){
if(time[i][k].op==1&&time[i][k].num!=0){//多人放回
back[count]=time[i][k].num;
count++;
}
}
if(count>0){
sort(back,back+count);
int c = 0;
for(k=1;k<=N;k++){
if(key[k]==0&&c<count){
key[k]=back[c];
c++;
}
}
}
for(k=0;k<time[i].size();k++){
if(time[i][k].op==0&&time[i][k].num!=0){//取出
int a = time[i][k].num;
for(j=1;j<=N;j++){
if(key[j]==a){
key[j]=0;
break;
}
}
}
}
}
for(i=1;i<=N;i++){
printf("%d ",key[i]);
}
return 0;
}
还是可以再优化的,以后想到怎么优化以后再来更新^_^