原题:Morning in Koltsovo
题意:给出n台要起飞的飞机及m台要降落的飞机,并给出他们起飞(降落)的时间,其中若一台飞机起飞,那么随后过t1秒后才允许下一台飞机起飞,或者过t2秒后允许下一台飞机降落;若一台飞机降落,那么随后过t3秒后才允许下一台飞机起飞,或过t4秒后允许下一台飞机降落。其中,若同一时间有飞机要起飞、降落,那么降落的飞机优先
解法:直接模拟。注意!其中若飞机 a 能被允许的起飞时间超过了飞机 b 初始的降落时间,哪怕飞机 a 的初始起飞时间比飞机 b 的初始降落时间要早,那么也是飞机 b 优先
#include <iostream>
using namespace std;
struct time {
int h, m, s;
void operator=(time& other) {
h = other.h;
m = other.m;
s = other.s;
}
bool operator<(time& other) {
if ((h < other.h) || (h == other.h && m < other.m)
|| (h == other.h && m == other.m && s < other.s)) return true;
return false;
}
bool operator>(time& other) {
if ((h > other.h) || (h == other.h && m > other.m)
|| (h == other.h && m == other.m && s > other.s)) return true;
return false;
}
bool operator==(time& other) {
if (h == other.h && m == other.m && s == other.s) return true;
return false;
}
void operator+=(int second) {
s += second;
m += s/60;
s = s%60;
h += m/60;
m = m%60;
h = h%24;
}
};
time a[200], ans[200];
int b[200];
int t1, t2, t3, t4, n, m;
int main() {
cin >> t1 >> t2 >> t3 >> t4;
cin >> n;
char c;
for (int i = 1; i <= n; i++) {
cin >> a[i].h;
cin >> c;
cin >> a[i].m;
cin >> c;
cin >> a[i].s;
b[i] = i;
}
cin >> m;
for (int i = n+1; i <= n+m; i++) {
cin >> a[i].h;
cin >> c;
cin >> a[i].m;
cin >> c;
cin >> a[i].s;
b[i] = i;
}
for (int i = 1; i <= n; i++)
for (int j = i+1; j <= n; j++)
if (a[i] > a[j]) {
time temp = a[i];
a[i] = a[j];
a[j] = temp;
int t = b[i];
b[i] = b[j];
b[j] = t;
}
for (int i = n+1; i <= n+m; i++)
for (int j = i+1; j <= n+m; j++)
if (a[i] > a[j]) {
time temp = a[i];
a[i] = a[j];
a[j] = temp;
int t = b[i];
b[i] = b[j];
b[j] = t;
}
int x = 1, y = n+1;
time t; int state;
if (a[x] < a[y]) {
t = a[x];
x++;
state = 1;
} else {
t = a[y];
y++;
state = 2;
}
while (1) {
if (x > n && y > n+m) break;
time temp = t;
if (state == 1) temp += t1;
else temp += t3;
if (x <= n && temp < a[x]) temp = a[x];
if ((x <= n) && (y > n+m || temp < a[y])) {
a[x] = temp;
x++;
t = temp;
state = 1;
} else {
temp = t;
if (state == 1) temp += t2;
else temp += t4;
if (y <= n+m && temp < a[y]) temp = a[y];
a[y] = temp;
y++;
t = temp;
state = 2;
}
}
for (int i = 1; i <= n+m; i++)
ans[b[i]] = a[i];
for (int i = 1; i <= n+m; i++) {
if (ans[i].h < 10) cout << 0;
cout << ans[i].h << ":";
if (ans[i].m < 10) cout << 0;
cout << ans[i].m << ":";
if (ans[i].s < 10) cout << 0;
cout << ans[i].s << endl;
}
}