1. 程式人生 > >CCF CSP公共鑰匙盒(100分)

CCF CSP公共鑰匙盒(100分)

問題描述

  有一個學校的老師共用N個教室,按照規定,所有的鑰匙都必須放在公共鑰匙盒裡,老師不能帶鑰匙回家。每次老師上課前,都從公共鑰匙盒裡找到自己上課的教室的鑰匙去開門,上完課後,再將鑰匙放回到鑰匙盒中。
  鑰匙盒一共有N個掛鉤,從左到右排成一排,用來掛N個教室的鑰匙。一串鑰匙沒有固定的懸掛位置,但鑰匙上有標識,所以老師們不會弄混鑰匙。
  每次取鑰匙的時候,老師們都會找到自己所需要的鑰匙將其取走,而不會移動其他鑰匙。每次還鑰匙的時候,還鑰匙的老師會找到最左邊的空的掛鉤,將鑰匙掛在這個掛鉤上。如果有多位老師還鑰匙,則他們按鑰匙編號從小到大的順序還。如果同一時刻既有老師還鑰匙又有老師取鑰匙,則老師們會先將鑰匙全還回去再取出。
  今天開始的時候鑰匙是按編號從小到大的順序放在鑰匙盒裡的。有K

位老師要上課,給出每位老師所需要的鑰匙、開始上課的時間和上課的時長,假設下課時間就是還鑰匙時間,請問最終鑰匙盒裡面鑰匙的順序是怎樣的?

輸入格式

  輸入的第一行包含兩個整數NK
  接下來K行,每行三個整數wsc,分別表示一位老師要使用的鑰匙編號、開始上課的時間和上課的時長。可能有多位老師使用同一把鑰匙,但是老師使用鑰匙的時間不會重疊。
  保證輸入資料滿足輸入格式,你不用檢查資料合法性。

輸出格式

  輸出一行,包含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 ≤ NK ≤ 10, 1 ≤ w ≤ N, 1 ≤ sc ≤ 30;
  對於60%的評測用例,1 ≤ N

K ≤ 50,1 ≤ w ≤ N,1 ≤ s ≤ 300,1 ≤ c ≤ 50;
  對於所有評測用例,1 ≤ NK ≤ 1000,1 ≤ w ≤ N,1 ≤ s ≤ 10000,1 ≤ c ≤ 100。

2018.9.23更新,時間過的真快,當初這道難了我一天的題,如今十幾分鍾就做對了。思路比那個時候清晰不少,完全模擬鑰匙。

  1. 多利用STL模板,很方便。
  2. 看看怎麼宣告二次函式吧。
  3. 不會了的時候,不要空想,要在紙上寫寫。
  4. 多用有意義的變數,我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] << " ";
	}
}