其他分享
首页 > 其他分享> > 2022.5.11 AcWing每日一题

2022.5.11 AcWing每日一题

作者:互联网

思维

每两个名字之间以 小于等于 相连,如果出现前面的名字字典序大于后面的名字,
可以消除等于情况,即消除不确定性。
需要注意的是,用双重循环遍历的时候,确定第一个名字在位置i,枚举第二个名字位置j;只要从i到j之间有一个链接消除了不确定性,i和j之间的大小关系就会被确定下来。这就是代码中flag的作用。

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

const int N = 110;

int n, k;
string str[N];
unordered_map<string, int> mp;
int ans[N][N];

int main() {
	memset(ans, -1, sizeof ans);

	scanf("%d %d", &k, &n);

	string name;
	int cnt = 1;
	for (int i = 1; i <= n; i++) {
		cin >> name;
		mp.insert({name, cnt});
		cnt++;
	}

	for (int ct = 1; ct <= k; ct++) {
		for (int i = 1; i <= n; i++) {
			cin >> str[i];
		}
		for (int i = 1; i <= n; i++) {
			int flag = 0;
			for (int j = i + 1; j <= n; j++) {
				if (str[j - 1] > str[j]) {
					flag = 1;
				}
				if (flag) {
					int p1 = mp[str[i]], p2 = mp[str[j]];
					ans[p1][p2] = 0, ans[p2][p1] = 1;
				}
			}
		}
	}

	for (int i = 1; i <= n; i++) {
		for (int j = 1; j <= n; j++) {
			if (i == j)
				cout << "B";
			else if (ans[i][j] == -1)
				cout << "?";
			else
				cout << ans[i][j];
		}
		cout << endl;
	}

	return 0;
}

标签:11,cnt,p1,int,mp,str,ans,2022.5,AcWing
来源: https://www.cnblogs.com/superPG/p/16256476.html