題解:P9938 [USACO21OPEN] Acowdemia II B

cly312發表於2024-09-16

首先根據每篇出版物構建一個資歷比較矩陣 \(g\),其中 \(g_{a,b} = 1\) 表示研究員 \(a\)\(b\) 資歷更高。

遍歷每篇出版物,識別出第一個降序的名字,然後假定該名字之後的所有研究員資歷都比當前名字對應的研究員資歷高即可。

程式碼:

#include<bits/stdc++.h>
using namespace std;

const int N = 110;
int g[N][N];//g[a][b] = 1表示a的資歷比b高
int n, m;
unordered_map<string, int> id;

int main() {
	cin >> m >> n;
	for (int i = 0; i < n; i++) {
		string s;
		cin >> s;
		id[s] = i;
	}
	string name[N];
	while (m--) {
		for (int i = 0; i < n; i++) cin >> name[i];
		for (int i = 0; i < n; i++) {
			int j = i + 1;
			while (j < n && name[j] > name[j - 1]) j++;//找到第一個降序的名字
			while (j < n) { //j之後的所有人資歷都嚴格比i高
				int a = id[name[i]], b = id[name[j]];
				g[b][a] = 1;
				j++;
			}
		}
	}
	for (int i = 0; i < n; i++) {
		for (int j = 0; j < n; j++)
			if (i == j) cout << 'B';
			else if (!g[i][j] && !g[j][i]) cout << '?';
			else cout << g[i][j];
		cout << endl;
	}
	return 0;
}

相關文章