CCF201709-2公共钥匙盒为什么只有40分??(陷阱)

相信点进这条博客的兄弟们都是这样的在这里插入图片描述

或这样的

在这里插入图片描述
我第一次做的了40分以为是时间复杂的较大于是改进成了第二种没想到从40分改到了30分(555)。通过仔细读题发现了到底是哪里出现了错误。如果你也是40或30分请仔细阅读下面图片的画圈部分。
在这里插入图片描述
我就是因为没有注意到要按从小到大的顺序换钥匙而失的分。
下面是我的代码:

#include <iostream>
#include <algorithm>
#include <set> 
using namespace std;
struct laoshi
{
	int yaoshi;//钥匙编号 
	int shangke;//上课时间 
	int shijian;//时长 
	int xiake;//下课时间 
};
bool cmp(laoshi a,laoshi b)//将下课时间相同的按钥匙编号小排序 
{
	if(a.xiake!=b.xiake) return a.xiake<b.xiake;
	else return a.yaoshi<b.yaoshi;
	 
}
int main(int argc, char** argv) {
	int n,k;
	cin>>k>>n;;
	laoshi l[n];//结构体数组 
	int key[k];
	for(int i=0;i<k;i++)
	{
		key[i]=i+1;
	}
	for(int i=0;i<n;i++)
	{
		cin>>l[i].yaoshi>>l[i].shangke>>l[i].shijian;
		l[i].xiake=l[i].shangke+l[i].shijian;//计算下课时间 
	}
	sort(l,l+n,cmp);
	set<int> st;//set容器去除相同的时间防止反复还钥匙 
	for(int i=0;i<n;i++)
	{
		st.insert(l[i].shangke);
		st.insert(l[i].xiake);
	}
	int z;
	for(set<int>::iterator it=st.begin();it!=st.end();it++)
	{//set只能通过迭代器访问 
		z=*it;
		for(int j=0;j<n;j++)//还钥匙 
		{
			if(z==l[j].xiake)
			{
				for(int s=0;s<k;s++)
				{
					if(key[s]==0)
					{
						key[s]=l[j].yaoshi;
						break;
					}
				}
			}
		}
		for(int j=0;j<n;j++)//取钥匙 
		{
			if(z==l[j].shangke)
			{
				for(int s=0;s<k;s++)
				{
					if(key[s]==l[j].yaoshi)
					{
						key[s]=0;
						break;
					}
				}
			}
		}
	}
	for(int i=0;i<k;i++)
	{
		if(i!=0)
		cout<<" "; 
		cout<<key[i];
	} 
	return 0;
}

有什么问题可以留在评论区一起讨论。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值