【CSP CCF记录】201709-2 第11次认证 公共钥匙盒

题目

样例输入:

5 2
4 3 3
2 2 7

样例输出:

1 4 3 2 5

样例说明:

第一位老师从时刻3开始使用4号教室的钥匙,使用3单位时间,所以在时刻6还钥匙。第二位老师从时刻2开始使用钥匙,使用7单位时间,所以在时刻9还钥匙。 每个关键时刻后的钥匙状态如下(X表示空): 时刻2后为1X345; 时刻3后为1X3X5; 时刻6后为143X5; 时刻9后为14325。

样例输入:

5 7
1 1 14
3 3 12
1 15 12
2 7 20
3 18 12
4 21 19
5 30 9

样例输出:

1 2 3 5 4

思路

参考了:CCF201709-2公共钥匙盒C++实现满分_公共钥匙盒 c++ ccf算法题 满分题解-优快云博客

整体思路是用while作为最外层循环,clock++遍历时刻。每一时刻先还钥匙再借钥匙。

还钥匙时:

  1. 查找借钥匙记录数组keys[],此时该还哪些钥匙,把要还的钥匙放进rkeys
  2. rkeys中元素按照钥匙编号由小到大排序
  3. 扫描钥匙盒loc[]数组,把钥匙从左到右挂在空挂钩上

借钥匙时:

  1. 查找借钥匙记录数组keys[],此时该借哪些钥匙
  2. 扫描钥匙盒loc[]数组,找到钥匙后把相应挂钩置0,代表此处为空

本题难点除了理清规则,还有就是如何定义结构体、如何对结构体数组进行排序。

代码

#include<bits/stdc++.h>
using namespace std;
typedef struct{
	int w,s,time;//钥匙编号,开始时间,结束时间 
}Key;
Key keys[1010];//借钥匙记录 
bool cmp(const Key& i1,const Key& i2)
{
	return i1.w <i2.w;
}
int main()
{
	int N,K;
	int loc[1010]={0};//记录不同挂钩上的钥匙编号 
	cin>>N>>K;
	//几把钥匙放几个挂钩 
	for(int i=1;i<=N;i++)//初始化钥匙挂钩 
	{
		loc[i]=i;
	}
	
	for(int i=0;i<K;i++)//初始化借钥匙记录 
	{
		int c;
		cin>>keys[i].w>>keys[i].s>>c;
		keys[i].time=keys[i].s+c;
	}
	int num=K;//钥匙借多少次就得还多少次 
	int clock=0;
	while(num!=0)
	{
		clock++;
		//先还 
		vector<Key> rkeys;//用于存储此时需归还的钥匙 
		for(int i=0;i<K;i++)//扫描有无要还的钥匙 
		{
			if(keys[i].time==clock)
			{
				rkeys.push_back(keys[i]);
			}
		}
		sort(rkeys.begin(),rkeys.end(),cmp);//根据规则对要换的钥匙进行排序 
		int m= rkeys.size();
		for(int i=0;i<m;i++)//把钥匙放进钥匙盒 
	   {
	   	 for (int j = 1; j <=N; j++)
	   	 {
	   	 	if(loc[j]==0)
		    {
		 	   loc[j]=rkeys[i].w;
		 	   num--;
		 	   break;
		    }	
		  }  
	   }

	   //再借 
		for(int i=0;i<K;i++)
		{
			if(keys[i].s==clock)
			{
				for (int j = 1; j <=N; j++)//扫描钥匙盒寻找相应的钥匙
				{
					if(loc[j]==keys[i].w)loc[j]=0;
				}
			}
		}
	}
	for(int i=1;i<=N;i++)
	{
	    cout<<loc[i]<<" ";
	}
	return 0;
}

运行

太多层循环了很怕运行时间过长,,,还好数据量不大

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值