一个数列,如果前k个数相等,a[k+1]<b[k+1]那么 a比b好,给出一个矩阵,如果aij=1,那么i和j位置的数是可以交换的,求给出矩阵状态下最好的数列。其实这个比较法就是尽量把小的数放在前面,但是加了一个交换的位置条件。自己想法就是把每个位置遍历,然后把连通分支整个找出来,再内部排序,赋值,接着找下一个连通分支,重复上述动作,循环n次,虽然有点重复,但是只有300个点,并不会超时。话说1A真开心。
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<queue>
using namespace std;
int b[303][303];
int a[303], leap[303], dp[303];
queue<int>p;
int main()
{
int i, j, m, n, ans, temp;
char c;
cin >> n;
for (i = 1; i <= n; i++)
cin >> a[i];
getchar();
for (i = 1; i <= n; i++)
{
for (j = 1; j <= n; j++)
{
c = getchar();
b[i][j] = c - '0';
}
getchar();
}
for (i = 1; i <= n; i++)
{
p.push(i);
memset(leap, 0, sizeof(leap));
leap[i] = 1;
while (p.size())
{
temp = p.front();
for (j = 1; j <= n; j++)
{
if (b[temp][j] == 1 && !leap[j])
{
p.push(j);
leap[j] = 1;
}
}
p.pop();
}
ans = 0;
for (j = 1; j <= n; j++)
{
if (leap[j])
{
ans++;
dp[ans] = a[j];
}
}
sort(dp + 1, dp + 1 + ans);
ans = 0;
for (j = 1; j <= n; j++)
{
if (leap[j])
{
ans++;
a[j] = dp[ans];
}
}
}
for (i = 1; i <= n; i++)
cout << a[i] << " ";
cout << endl;
return 0;
}
这是我当时第一次做cf的b题,当时的a题还是50分钟这样做出来的,b题就更不敢奢望了,现在感觉自己有提升,但是 作为一个初学者,想要获得提升是很容易的,还要继续走下去。