学习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