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