試題編號: | 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; |
分析:我用了一個非常麻煩的方式,以時間爲單位進行推進,每個時間點先檢測有無還鑰匙,再檢測有無取鑰匙。在取鑰匙還鑰匙的處理上用了排序和添加了許多計數變量,總之自己寫出來了,還是挺開心的。
#include<iostream>
#include<algorithm>
using namespace std;
struct{
int s;//開始時間
int o;//結束時間
int w;//鑰匙號
}a[100];
int main(){
int N,K,j,w,s,c,final=0;
int count=0;
int b[100],d[100];
scanf("%d%d",&N,&K);
for(int i=1;i<=N;i++){
b[i]=i;//初始鑰匙擺放
}
for(i=1;i<=K;i++){
scanf("%d%d%d",&w,&s,&c);
a[i].w=w;
a[i].s=s;
a[i].o=s+c;
}
for(i=1;i<=K;i++){ //通過比較得到最後還鑰匙的時間點
if(a[i].o>final)
final=a[i].o;
}
for(i=0;i<=final;i++){ //每個時間點輪詢
/*先還鑰匙*/
count=0;
for(j=1;j<=K;j++){
if(a[j].o==i){ //j老師此時還鑰匙
count++;//記錄還鑰匙的老師數量
d[count]=a[j].w;//將待還鑰匙放入排序池
}
}
int n=0;
if(count!=0)
sort(d+1,d+count);//排序
for(int k=1;k<=N;k++){
if(b[k]==0){
if(count==n)
break; //鑰匙還完
n++;
b[k]=d[n];
}
}
for(j=1;j<=K;j++){
if(a[j].s==i){
for(int n=1;n<=N;n++)
if(a[j].w==b[n]){
b[n]=0;
break;
}
}
}
}
for(i=1;i<=N;i++)
printf("%d ",b[i]);
return 0;
}