CCF CSP公共鑰匙盒(100分)
問題描述
有一個學校的老師共用N個教室,按照規定,所有的鑰匙都必須放在公共鑰匙盒裡,老師不能帶鑰匙回家。每次老師上課前,都從公共鑰匙盒裡找到自己上課的教室的鑰匙去開門,上完課後,再將鑰匙放回到鑰匙盒中。
鑰匙盒一共有N個掛鉤,從左到右排成一排,用來掛N個教室的鑰匙。一串鑰匙沒有固定的懸掛位置,但鑰匙上有標識,所以老師們不會弄混鑰匙。
每次取鑰匙的時候,老師們都會找到自己所需要的鑰匙將其取走,而不會移動其他鑰匙。每次還鑰匙的時候,還鑰匙的老師會找到最左邊的空的掛鉤,將鑰匙掛在這個掛鉤上。如果有多位老師還鑰匙,則他們按鑰匙編號從小到大的順序還。如果同一時刻既有老師還鑰匙又有老師取鑰匙,則老師們會先將鑰匙全還回去再取出。
今天開始的時候鑰匙是按編號從小到大的順序放在鑰匙盒裡的。有K
輸入格式
輸入的第一行包含兩個整數N, K。
接下來K行,每行三個整數w, s, c,分別表示一位老師要使用的鑰匙編號、開始上課的時間和上課的時長。可能有多位老師使用同一把鑰匙,但是老師使用鑰匙的時間不會重疊。
保證輸入資料滿足輸入格式,你不用檢查資料合法性。
輸出格式
輸出一行,包含N個整數,相鄰整數間用一個空格分隔,依次表示每個掛鉤上掛的鑰匙編號。
樣例輸入
5 2
4 3 3
2 2 7
樣例輸出
1 4 3 2 5
樣例說明
第一位老師從時刻3開始使用4號教室的鑰匙,使用3單位時間,所以在時刻6還鑰匙。第二位老師從時刻2開始使用鑰匙,使用7單位時間,所以在時刻9還鑰匙。
每個關鍵時刻後的鑰匙狀態如下(X表示空):
時刻2後為1X345;
時刻3後為1X3X5;
時刻6後為143X5;
時刻9後為14325。
樣例輸入
5 7
1 1 14
3 3 12
1 15 12
2 7 20
3 18 12
4 21 19
5 30 9
樣例輸出
1 2 3 5 4
評測用例規模與約定
對於30%的評測用例,1 ≤ N, K ≤ 10, 1 ≤ w ≤ N, 1 ≤ s, c ≤ 30;
對於60%的評測用例,1 ≤ N
對於所有評測用例,1 ≤ N, K ≤ 1000,1 ≤ w ≤ N,1 ≤ s ≤ 10000,1 ≤ c ≤ 100。
2018.9.23更新,時間過的真快,當初這道難了我一天的題,如今十幾分鍾就做對了。思路比那個時候清晰不少,完全模擬鑰匙。
- 多利用STL模板,很方便。
- 看看怎麼宣告二次函式吧。
- 不會了的時候,不要空想,要在紙上寫寫。
- 多用有意義的變數,我7月份寫的已經看不懂了。。
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
int main()
{
vector<int>SortOfkey;
int times = 0;
int N, K;
cin >> N >> K;
int *key = new int[N];
for (int i = 0; i < N; i++)
{
key[i] = i + 1;
}
int **biao = new int*[K];
for (int i = 0; i < K; i++)
{
biao[i] = new int[3];
}
int k = 0; int bu = K;
while (bu--)//原先寫的K--,鬼知道後面經歷了什麼。吸取教訓,像這種全域性變數,給人家應有的尊嚴,這種小事就不要勞他大駕了
{
cin >> biao[k][0] >> biao[k][1] >> biao[k][2];
k++;
}
for (int i = 0; i < K; i++)
{
biao[i][2] = biao[i][1] + biao[i][2];
}
while (times!=11000)
{
//還鑰匙
SortOfkey.clear();
for (int i = 0; i < K; i++)
{
if (times==biao[i][2])
{
SortOfkey.push_back(biao[i][0]);
}
}
if (SortOfkey.size()!=0)
{
sort(SortOfkey.begin(), SortOfkey.end());
for (int i = 0; i < SortOfkey.size(); i++)
{
for (int j = 0; j < N; j++)
{
if (key[j]==0)
{
key[j] = SortOfkey[i];
break;
}
}
}
}
//取鑰匙
for (int i = 0; i < K; i++)
{
if (times==biao[i][1])
{
for (int j = 0; j < N; j++)
{
if (key[j]==biao[i][0])
{
key[j] = 0;
}
}
}
}
times++;
}
for (int i = 0; i < N; i++)
{
cout << key[i] << " ";
}
}
2018.7.23
程式碼不正確只有70分。先挖個坑。模擬鑰匙。
#include<iostream>
using namespace std;
int main() {
int N, K;
cin >> N >> K;
int *key = new int[N+3];//key是從1開始的
for (int i = 1; i < N+1; i++)
{
key[i] = i;
}
int *Oqi = new int[N + 3];
int *Ozhi = new int[N + 3];
int *Onage = new int[N + 3];
int *qi = new int[N+3];
int *zhi = new int[N+3];
int *nage = new int[N + 3];
for (int i = 1; i < K+1; i++)
{
cin >> Onage[i] >> Oqi[i] >> Ozhi[i];
}
int pp = 1;
for (int i = 1; i < N+3; i++)
{
for (int j = 1; j < K+1; j++)
{
if (Onage[j] == i)
{
nage[pp] = Onage[j];
qi[pp] = Oqi[j];
zhi[pp++] = Ozhi[j];
}
}
}
for (int times = 0; times <11000; times++)
{
for (int i = 1; i < K + 1; i++)
{
if (times == qi[i] + zhi[i])
{
for (int j = 1; j < N+1; j++)
{
if (key[j] == 0)
{
key[j] = nage[i];
break;
}
}
}
}
for (int i = 1; i < K+1; i++)
{
if (times == qi[i])
{
for (int j = 1; j < N+1; j++)
{
if (key[j] == nage[i])
{
key[j] = 0;
break;
}
}
}
}
}
for (int i = 1; i < N+1; i++)
{
cout << key[i] << " ";
}
}