2020年6月10日 星期三

b944: 好想上廁所(男廁篇) 解題心得

題目連結:

一開始給予一個整數n (0<n<21),作為小便斗的數量上限。

然後給予兩個整數a,b (0<=a,b<2147483647),作為下一個男生的編號和使用時間。

測資讀入直到EOF。所有的男生搜尋空閒小便斗時都會從編號最小的開始找。

如果使用時間為0,依然會占用小便斗直到下一個人進來。

由於男生找廁所的條件是,盡量挑選旁邊沒人的小便斗,如果真的沒得挑,才會將就於旁邊友人的小便斗,最簡單的方式就是跑兩次FOR-LOOP,第一次一個條件判斷觀察左右兩邊有沒有人,要小心的是觀察的對象不要超過邊界了,如果第一次沒找滿意的位置,第二次再判斷只要有空位就得上,這樣就可以順利完成了。



以下附上程式碼。如果還有任何問題請在下面留言,或是直接寄信給我囉。
#include <iostream>
#include <vector>
#include <string>
#pragma GCC optimize("Ofast,no-stack-protector")
using namespace std;
int main()
{
	cin.tie(0), cin.sync_with_stdio(false);
	int n;
	cin >> n;
	vector<long long> v;
	vector<long long> time;

	for (int i = 0; i < n; i++) {
		v.push_back(0);
		time.push_back(0);
	}
	long long a, b;
	while (cin >> a >> b) {
		bool find = false;
		for (int i = 0; i < n; i++) {
			if (v[i] == 0) {
				if (i - 1 >= 0) {
					if (v[i - 1] != 0) continue;
				}
				if (i + 1 < n) {
					if (v[i + 1] != 0) continue;
				}
				v[i] = a;
				time[i] = b;
				find = true;
				break;
			}
		}
		if (find == false) {
			for (int i = 0; i < n; i++) {
				if (v[i] == 0) {
					v[i] = a;
					time[i] = b;
					find = true;
					break;
				}
			}
		}
		if (find == false) {
			cout << "Not enough" << endl;
		}
		string num = "Number: ";
		string tim = "Time: ";

		for (int i = 0; i < n; i++) {
			num += to_string(v[i]) + " ";
			tim += to_string(time[i]) + " ";
			if (time[i] != 0) {
				time[i]--;
			}
			if (time[i] == 0) {
				v[i] = 0;
			}
		}
		cout << num << endl;
		cout << tim << endl;
	}
}

沒有留言:

張貼留言

o079. 4. 最佳選擇

 題目描述: 給一個長度為 n 的正整數序列 a1,a2...an ,你可以執行多次操作 (包含 0 次),每次操作只能選擇這個序列的第一個或最後一個數字,再將這個數字從序列中刪除並自己搜集起來。 求滿足總和不超過 k 且搜集的數字奇數和偶數個數相同的條件下,所能搜集的數字總和最...