ccf201709-2公共钥匙需总结一下

这个题 花费了我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;
}

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值