題目連結:
一開始給予一個整數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;
}
}
沒有留言:
張貼留言