USACO历年青铜组真题解析 | 2019年12月Cow Gymnastics

学习C++从娃娃抓起!记录下USACO(美国信息学奥赛)备考青铜组别比赛学习过程中的题目,记录每一个瞬间。

附上汇总贴:USACO历年青铜组真题解析 | 汇总-CSDN博客


【题目描述】

为了提高健康水平,奶牛们开始进行体操训练了!Farmer John 选定了他最喜爱的奶牛 Bessie 来执教其他 N 头奶牛,同时评估她们学习不同的体操技术的进度。

K 次训练课的每一次,Bessie 都会根据 N 头奶牛的表现给她们进行排名。之后,她对这些排名的一致性产生了好奇。称一对不同的奶牛是一致的,如果其中一头奶牛在每次训练课中都表现得都比另一头要好。

请帮助 Bessie 计算一致的奶牛的对数。

【输入】

输入的第一行包含两个正整数 K 和 N。以下 K 行每行包含整数 1…N 的某种排列,表示奶牛们的排名(奶牛们用编号 1…N 进行区分)。如果在某一行中 A 出现在 B 之前,表示奶牛 A 表现得比奶牛 B 要好。

【输出】

输出一行,包含一致的奶牛的对数。

【输入样例】

3 4
4 1 2 3
4 1 3 2
4 2 1 3

【输出样例】

4

【代码详解】

#include <bits/stdc++.h>
using namespace std;
int k, n, a[25][25]={0}, t[25]={0}, ans=0;
int main()
{
    cin >> k >> n;  // 输入k和n
    while (k--) {  // 依次读入k行数据
        for (int i=1; i<=n; i++) {  // 依次记录n个数据
            cin >> t[i];  
        }
        for (int i=1; i<n; i++) {  // 定义二维矩阵,分别记录每2个数的先后关系
            for (int j=i+1; j<=n; j++) {
                a[t[j]][t[i]] = 1;  // t[j]在t[i]后面,将表现不好的标记为1
            }
        }
    }
    for (int i=1; i<=n; i++) {  // 处理二维矩阵的斜线位置(左上到右下的斜线)
        for (int j=1; j<=n; j++) {
            if (i==j) a[i][j] = 1;  // 这些也标记为1
        }
    }
    for (int i=1; i<=n; i++) {  // 遍历二维矩阵
        for (int j=1; j<=n; j++) {
            if (a[i][j]==0) ans++;  // 对于值为0的单元格,就是一对A优于B的存在。统计ans就是一致的奶牛的对数
        }
    }
    cout << ans << endl;
    return 0;
}

【运行结果】

3 4
4 1 2 3
4 1 3 2
4 2 1 3
4

猜你喜欢

转载自blog.csdn.net/guolianggsta/article/details/134786344
今日推荐