CCF 201709-2 公共鑰匙盒
阿新 • • 發佈:2018-12-09
正確程式碼來源(ps:大家可以自己找) 總體思路就是根據題意解題,但是由於數字範圍限制,採用結構體更方便,但是我不太會用。。。看到很多解這個題的方法都是用結構體。
本來自己寫的是用for迴圈和if語句暴力解決問題,雖然可能是對的,但是提交後超時了,得了70分。。。不過確實這個不適合for迴圈,它的數字範圍太大了,多個for迴圈巢狀非常耗時間,大家看看就好,求輕噴。。。
下面是我自己寫的程式碼
#include<iostream>
using namespace std;
int main()
{
int n,k;
cin>>n>>k;
int w[k],s[k],c[k],e[k]; //分別是題目中的w,s,c,e是結束時間
for(int i=0;i<k;i++)
{
cin>>w[i]>>s[i]>>c[i];
}
int max_e=-1;
for(int i=0;i<k;i++)
{
e[i]=c[i]+s[i];
if(e[i]>max_e)//時間範圍
{
max_e=e[i];
}
}
int key[n+1 ]; //key[i]=j表示第i位置上是j鑰匙
for(int i=0;i<=n;i++)
{
key[i]=i;
}
for(int i=0;i<=max_e;i++) //時間線
{
int count=0; //判斷是否有多個人在同一時刻還鑰匙
for(int a=0;a<k;a++)
{
if(e[a]==i)
{
count++;
if(count>=2 )
break;
}
}
if(count==1) //在當前時刻只有一個人還
{
for(int a=0;a<k;a++)
{
if(e[a]==i)
{
for(int z=1;z<=n;z++) //找到左邊第一個空位
{
if(key[z]==0)
{
key[z]=w[a];
break;
}
}
}
}
}
else //多個人同時還鑰匙
{
for(int m=1;m<=n;m++)//鑰匙的序號從小到大,序號線,類似時間線
{
for(int x=0;x<k;x++)
{
if(m==w[x]&&e[x]==i)//序號小的先還
{
for(int z=1;z<=n;z++)//找到空位放進去
{
if(key[z]==0)
{
key[z]=w[x];
break;
}
}
}
}
}
}
for(int j=0;j<k;j++) //先還後借
{
if(s[j]==i)
{
for(int d=1;d<=n;d++)
{
if(w[j]==key[d])
{
key[d]=0;
break;
}
}
}
}
}
for(int i=1;i<=n;i++)
{
cout<<key[i]<<" ";
}
return 0;
}