本文主要是介绍CCF 20170902 公共钥匙盒(只有40分,不知道为什么,求教啊!),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
/*
仍然只40分!
Author:L
Date:2019/3/16 20:40-00:15
Project:ccf2017/09-2 公共钥匙盒
*/
#include <iostream>
using namespace std;
class key{
public:
int num;//需要的钥匙号
int start;//取走 w钥匙号的时间
int temp;//w钥匙号需要用多久
int end;//w钥匙需要还的时间
};
int main()
{
//n把钥匙,k位老师需要用到钥匙
int n,k,min_end=0,max_end=0,c[1001];
cin>>n>>k;
//存储钥匙的位置
int a[1001];
//存储k位老师需要的钥匙号以及取、还的时间
key b[1001];
for(int i=0;i<k;i++)
{
cin>>b[i].num>>b[i].start>>b[i].temp;
b[i].end=b[i].start+b[i].temp;
}
//初始化钥匙位置
for(int j=1;j<=n;j++)
{
a[j]=j;
}
//找到需要还的最早的时刻 b[min_end].end
for(int i=1;i<k;i++)
{
if(b[min_end].end>b[i].end)
min_end=i;//0
if(b[max_end].end<b[i].end)
max_end=i;//1
}
//在 小于 b[min_end].end时刻 的需要取钥匙的位置为空。10305
for(int i=0;i<k;i++)
{
if(b[i].start<b[min_end].end)
a[b[i].num]=0;
}
//在等于 b[min_end].end时刻开始的 num 从小到大依次放进去。
//在每一个时刻,先还再拿->还钥匙编号从小到大,空位 从左至右,
for(int x=b[min_end].end;x<=b[max_end].end;x++)
{
int cc=0;
//找到 b[min_end].end时刻需要还钥匙的那些num(钥匙号)
for(int i=0;i<k;i++)
{
if(b[i].end==x)
{
c[cc]=b[i].num;
cc++;
}
}
//c[]中的从小到大排序,共有c个钥匙需要还(冒泡排序)
for(int j=cc;j>1;j--)
{
for(int i=0;i<j-1;i++)
{
if(c[i]>c[i+1]) swap(c[i],c[j+1]);
}
}
if(cc!=0)
{
//还钥匙
int d=0;
for(int i=1;i<=n;i++)
{
if(a[i]==0)
{
a[i]=c[d];
d++;
if(d==cc) break;
}
}
}
//取钥匙
for(int i=0;i<k;i++)
{
if(b[i].start==x)
for(int j=1;j<=n;j++)
{
if(a[j]==b[i].num)
a[j]=0;
}
}
}
//初始化钥匙位置
for(int j=1;j<=n;j++)
{
cout<<a[j]<<" ";
}
return 0;
}
这篇关于CCF 20170902 公共钥匙盒(只有40分,不知道为什么,求教啊!)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!