試題編號: | 201709-2 |
試題名稱: | 公共鑰匙盒 |
時間限制: | 1.0s |
內存限制: | 256.0MB |
問題描述: |
問題描述 有一個學校的老師共用N個教室,按照規定,所有的鑰匙都必須放在公共鑰匙盒裏,老師不能帶鑰匙回家。每次老師上課前,都從公共鑰匙盒裏找到自己上課的教室的鑰匙去開門,上完課後,再將鑰匙放回到鑰匙盒中。 輸入格式 輸入的第一行包含兩個整數N, K。 輸出格式 輸出一行,包含N個整數,相鄰整數間用一個空格分隔,依次表示每個掛鉤上掛的鑰匙編號。 樣例輸入 5 2 樣例輸出 1 4 3 2 5 樣例說明 第一位老師從時刻3開始使用4號教室的鑰匙,使用3單位時間,所以在時刻6還鑰匙。第二位老師從時刻2開始使用鑰匙,使用7單位時間,所以在時刻9還鑰匙。 樣例輸入 5 7 樣例輸出 1 2 3 5 4 評測用例規模與約定 對於30%的評測用例,1 ≤ N, K ≤ 10, 1 ≤ w ≤ N, 1 ≤ s, c ≤ 30; |
C++實現:
要注意當有多把鑰匙同時歸還時的排序操作,否則題目中的樣例都能運行成功但還是0分。
#include <iostream>
using namespace std;
int main(){
int N,K;
cin>>N>>K;
int w[1000],s[1000],c[1000],t[1000],n[1000],time=0;
int i,j;
for(i=1;i<=N;i++)
n[i]=i; //初始狀態時,每個掛鉤上掛着對應編號的鑰匙
for(i=0;i<K;i++)
cin>>w[i]>>s[i]>>c[i];
for(i=0;i<K;i++)
{
t[i]=s[i]+c[i]; //計算每位老師還鑰匙的時間
if(t[i]>time)
time=t[i]; //比較得出所有鑰匙歸還完畢的總時間
}
for(int m=1;m<=time;m++)
{
int sort[1000],x=0; //若有多位老師同時歸還鑰匙,需要將鑰匙按編號排序再歸還
for(i=0;i<K;i++)
if(t[i]==m)
sort[x++]=w[i]; //將鑰匙編號放入待排序的數組
if(x>1) //對多把鑰匙按編號進行排序
{
for(i=x-1;i>0;i--)
for(j=0;j<i;j++)
if(sort[j]<sort[j+1])
swap(sort[j],sort[j+1]);
}
for(j=1;j<=N;j++)
if(n[j]==0&&x!=0) //若有空的掛鉤且排序數組中還有鑰匙,按編號從小到大掛上
n[j]=sort[--x];
for(i=0;i<K;i++)
{
if(s[i]==m) //若有老師借走鑰匙,將該掛鉤置0
{
for(int l=1;l<=N;l++)
if(n[l]==w[i])
n[l]=0;
}
}
}
for(i=1;i<=N;i++)
cout<<n[i]<<" ";
cout<<endl;
return 0;
}