试题编号: | 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; |
---|
基本思路:
1、定义一个结构体,存放钥匙编号、拿钥匙时间、还钥匙时间。
2、定义2个结构体数组,数组1按拿钥匙时间(主)和钥匙编号(次)从小到大排序,数组2按还钥匙时间(主)和钥匙编号(次)从小到大排序。
3、定义一个记录数组,记录该位置上目前挂的是几号钥匙。
4、从最小的拿钥匙时间开始,到最大的还钥匙时间结束,做一个循环。循环内部,对每一位老师判断该时间是否有人拿钥匙或还钥匙,并修改相应的数据。
AC代码:
#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
typedef struct Class{
int key;
int start;
int en;
}Class;
int key,tea;
Class cStart[1001],cEnd[1001];
int k[1000];//i位置上是k[i]号钥匙,k[i]=0表示i位置没有钥匙
void init(){
scanf("%d%d",&key,&tea);
for(int i=1;i<=tea;i++){
scanf("%d%d%d",&cStart[i].key,&cStart[i].start,&cStart[i].en);
cStart[i].en+=cStart[i].start;
cEnd[i]=cStart[i];
}
for(int i=1;i<=key;i++){
k[i]=i;
}
}
//按拿钥匙时间由小到大排序,次钥匙号码
bool startTime(Class a, Class b){
if(a.start==b.start) return a.key<b.key;
return a.start<b.start;
}
//按还钥匙时间从小到大排序,次钥匙号码
bool endTime(Class a, Class b){
if(a.en==b.en) return a.key<b.key;
return a.en<b.en;
}
//拿钥匙
void getKey(Class x){
int num = x.key;
for(int i=1;i<=key;i++){
if(k[i]==x.key){
k[i]=0;
return;
}
}
}
//还钥匙
void putKey(Class x){
for(int i=1;i<=key;i++){
if(k[i]==0){
k[i] = x.key;
return;
}
}
}
void display(){
// for(int i=1;i<=tea;i++)
// printf("key=%d,start=%d,end=%d\n",cStart[i].key,cStart[i].start,cStart[i].en);
for(int i=1;i<=key;i++)
printf("%d ",k[i]);
printf("\n");
printf("--------------\n");
}
void solve(){
for(int i=cStart[1].start;i<=cEnd[tea].en;i++){
for(int j=1;j<=tea;j++){
if(cEnd[j].en==i){
putKey(cEnd[j]);
// printf("time %d put key%d:\n",i,cEnd[j].key);
// display();
}
if(cStart[j].start==i){
getKey(cStart[j]);
// printf("time %d get key%d:\n",i,cStart[j].key);
// display();
}
}
}
}
int main(){
init();
sort(cStart+1,cStart+tea+1,startTime);
sort(cEnd+1,cEnd+tea+1,endTime);
solve();
for(int i=1;i<=key;i++)
printf("%d ",k[i]);
return 0;
}
注意:数组是从1开始存的,所以sort函数是
sort(cStart+1,cStart+tea+1,startTime);
记得cStart+tea+1里还要加上一个1。