相信点进这条博客的兄弟们都是这样的
或这样的
我第一次做的了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;
}
有什么问题可以留在评论区一起讨论。