試題編號: | 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; |
解題思路:
先定義一個教師結構體Teacher配合vector一起使用,裏面有鑰匙編號、使用鑰匙的時間、標識符(0借1還),再創建一個鑰匙列表key。vector先按還鑰匙的時間升序排列,若還取鑰匙的時間相同,則按先借後還排列,若多位老師還鑰匙,則按鑰匙編號升序排列。排序好以後,用for-each循環對vector進行遍歷進行借還鑰匙操作即可。最後對鑰匙列表進行輸出即可。
100分代碼:
#include <bits/stdc++.h>
using namespace std;
struct Teacher
{
int key; //鑰匙編號
int time; //使用鑰匙的時間
int flag; //設置標識符,0借,1還
};
bool Cmp(Teacher a,Teacher b)
{
if(a.time != b.time)
{
return a.time < b.time; //先按還取鑰匙的時間升序排序
}
else if(a.flag != b.flag)
{
return a.flag > b.flag;
}
else //若多位老師還鑰匙
{
return a.key < b.key; //則按鑰匙編號升序排列
}
}
int main()
{
ios::sync_with_stdio(false); //取消cin和stdin的同步
int N,K;
int key[1001]; //鑰匙列表
cin >> N >> K;
vector<Teacher> v;
for (int i = 1; i <= N; i++)
{
key[i] = i; //對鑰匙進行賦初值
}
for (int i = 0; i < K; ++i)
{
int w,s,c; //老師要使用的鑰匙編號w、開始上課的時間s和上課的時長c
cin >> w >> s >> c;
v.push_back({w,s,0}); //借
v.push_back({w,s+c,1}); //還
}
sort(v.begin(),v.end(),Cmp);
for(auto it:v)
{
if(it.flag == 0) //借鑰匙
{
for (int i = 1; i <= N; i++)
{
if(key[i] == it.key)
{
key[i] = 0; //鑰匙被借走了
break;
}
}
}
else //還鑰匙
{
for (int i = 1; i <= N; i++)
{
if(key[i] == 0)
{
key[i] = it.key; //把鑰匙歸還
break;
}
}
}
}
for (int i = 1; i <= N; i++)
{
cout << key[i] << " ";
}
return 0;
}