这个题 花费了我6小时的时间 在考场上是一定做不完的 这是个很大的问题 所以今天要总结一下 该题思路
首先创建两个结构体 一个存老师的数据:钥匙编号 上课时间 上课时长 一个存钥匙状态数据:是否被借出去 归还时刻 目前在哪个挂钩挂着
然后是给输入的信息按照上课时刻排序 初始化 不多说
正文开始
最外层循环 按照时刻循环(所以要先排序) 到输入信息的最大时刻结束循环
第二层循环分为须归还的钥匙 和 老师要借出的钥匙
须归还的钥匙判断当前时刻和钥匙需归还时间是否匹配
老师要借出的钥匙判断当前时刻和老师开课时间是否匹配
相应修改参数
最外层循环结束
再次开始时刻循环 从老师开课的最大时刻开始 到归还钥匙的最大时刻结束
按照时刻依次归还钥匙 最后输出结果
#include<iostream>
using namespace std;
struct teacher{
int w; //钥匙编号
int s; //开始上课时间
int c; //上课时长
};
struct Key{
int flag;
int time;
int num;//放在的位置
};
int main(){
int i,j,m;
int n,k;
cin>>n>>k;
teacher te[k];
for(i=0;i<k;i++){ //先排序
cin>>te[i].w>>te[i].s>>te[i].c;
if(i>0){
teacher v=te[i];
for(j=i-1;j>=0&&te[j].s>v.s;j--){
te[j+1]=te[j];
}
te[j+1]=v;
}
}
Key key[n+1];
for(i=1;i<=n;i++){ //钥匙初始化
key[i].num=i;
key[i].flag=0; //钥匙的状态 0表示挂着 1表示借走
key[i].time=0; //钥匙何时归还
}
int box[n+1];
for(i=1;i<=n;i++){ //挂钩匹配状态
box[i]=i;
}
//正文开始
for(i=1;i<=te[k-1].s;i++){ //时刻表
for(j=1;j<=n;j++){ //钥匙归还的时候
if(i==key[j].time){
key[j].flag=0;
key[j].time=0;
for(m=1;m<=n;m++){
if(box[m]==-1){
key[j].num=m;
box[m]=j;
break;
}
}
}
}
for(j=0;j<k;j++){ //教师要借的时候
if(i==te[j].s){ //j是数组中的下标,第几个输入的数据
box[key[te[j].w].num]=-1; //钥匙目前所在box变成-1
key[te[j].w].flag=1; //key的下标表示要借的钥匙编号
key[te[j].w].num=-1;
key[te[j].w].time=te[j].c+te[j].s;
}
}
}
int max=-10000;
for(i=1;i<=n;i++ ){
if(max<key[i].time){
max=key[i].time;
}
}
for(i=te[k-1].s+1;i<=max;i++){
for(j=1;j<=n;j++){ //钥匙归还的时候
if(i==key[j].time){
for(m=1;m<=n;m++){
if(box[m]==-1){
key[j].num=m;
box[m]=j;
break;
}
}
key[j].flag=0;
key[j].time=0;
}
}
}
for(i=1;i<=n;i++){
cout<<box[i]<<" ";
}
return 0;
}