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;
}

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

猜你喜欢

转载自blog.csdn.net/Kyrie6c/article/details/105720395