目录
- 题目
- 【XR-4】模拟赛
- 题目描述
- 输入格式
- 输出格式
- 样例 #1
- 样例输入 #1
- 样例输出 #1
- 样例 #2
- 样例输入 #2
- 样例输出 #2
- 样例 #3
- 样例输入 #3
- 样例输出 #3
- 提示
- 解题思路
- C++的Code
- 运行结果
- Python的代码
- 运行结果
题目
【XR-4】模拟赛
题目描述
X 校正在进行 CSP 前的校内集训。
一共有 n n n 名 OIer 参与这次集训,教练为他们精心准备了 m m m 套模拟赛题。
然而,每名 OIer 都有各自的时间安排,巧合的是,他们在接下来的 k k k 天中都恰好有 m m m 天有空打模拟赛。
为了方便管理,教练规定一个人必须按顺序打完 m m m 套模拟赛题。
比如,小 X 在接下来的第 2 , 3 , 5 2,3,5 2,3,5 天有空打模拟赛,那么他就必须在第 2 2 2 天打第 1 1 1 套模拟赛题,第 3 3 3 天打第 2 2 2 套模拟赛题,第 5 5 5 天打第 3 3 3 套模拟赛题。
教练需要为每一个人的每一次模拟赛做准备,为了减小工作量,如果在某一天有多个人打同一套模拟赛题,那么教练只需要在这一天准备一场使用这一套题的模拟赛即可。
你作为机房大佬,教练想请你帮他计算一下,他每天需要准备多少场模拟赛。
输入格式
第一行三个整数 n , m , k n,m,k n,m,k。
接下来 n n n 行,每行 m m m 个整数,第 i i i 行第 j j j 列的整数 a i , j a_{i,j} ai,j 表示第 i i i 个人在接下来的 k k k 天中第 j j j 个有空的日子为第 a i , j a_{i,j} ai,j 天。
输出格式
一行 k k k 个整数,第 i i i 个整数表示接下来的第 i i i 天教练需要准备的模拟赛场数。
样例 #1
样例输入 #1
1 3 5
2 3 5
样例输出 #1
0 1 1 0 1
样例 #2
样例输入 #2
6 3 7
2 3 4
2 5 7
3 5 7
1 3 5
5 6 7
1 2 3
样例输出 #2
1 2 3 1 3 1 1
样例 #3
样例输入 #3
10 10 20
2 3 4 8 9 11 12 16 17 18
2 3 6 10 12 13 14 15 19 20
1 3 7 10 11 13 14 15 17 19
1 2 4 6 7 9 15 17 19 20
2 3 5 6 9 11 14 16 19 20
1 2 3 8 9 10 11 12 15 19
1 4 6 7 9 12 13 17 18 19
1 7 8 9 10 11 13 15 18 20
1 5 6 7 8 9 13 16 18 19
4 5 7 10 11 13 14 17 18 20
样例输出 #3
1 2 2 3 2 2 4 3 3 3 3 4 2 1 3 1 2 2 2 1
提示
本题采用捆绑测试。
- Subtask 1(13 points): n = m = k = 1 n = m = k = 1 n=m=k=1。
- Subtask 2(24 points): n = 1 n = 1 n=1。
- Subtask 3(24 points): m = 1 m = 1 m=1。
- Subtask 4(39 points):无特殊限制。
对于 100 % 100\% 100% 的数据, 1 ≤ n , m , k ≤ 1 0 3 1 \le n,m,k \le 10^3 1≤n,m,k≤103, m ≤ k m \le k m≤k, 1 ≤ a i , 1 < a i , 2 < ⋯ < a i , m ≤ k 1 \le a_{i,1} < a_{i,2} < \cdots < a_{i,m} \le k 1≤ai,1<ai,2<⋯<ai,m≤k。
解题思路
- 观察题目,转换一下题目。
- 把每一列作为一个数组,遍历每一列,某一个数字在所有列中出现过的次数(一列出现多次记为1次)为x,那么对应天数的答案就是x。
C++的Code
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main() {
int n, m, k;
cin >> n >> m >> k;
vector<vector<int>> nums; // 初始化二维数组
vector <int> nums0;
vector<vector<int>> days(k, vector<int>(m, 0)); // 记录每天需要比赛的次数
// 输入数据
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
int tmp;
cin >> tmp;
nums0.push_back(tmp); // 存储每一行的数据
}
nums.push_back(nums0);
nums0.clear(); // 清空数组
}
// 进行每天比赛的次数的数组的赋值, 模拟, 把nums每一列的对应的元素的位置赋值为1.
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
days[nums[j][i] - 1][i] = 1;
}
}
// 进行数据的输出
for (int i = 0; i < k; i++) {
cout << count(days[i].begin(), days[i].end(), 1) << " ";
}
cout << endl;
return 0;
}
运行结果
Python的代码
n, m, k = map(int, input().split(" "))
nums = []
days = [[0 for _ in range(m)] for _ in range(k)]
# days = [[0 for _ in range(k)] for _ in range(m)]
for i in range(n):
nums.append(list(map(int, input().strip().split(" "))))
for i in range(m):
for j in range(n):
days[nums[j][i] - 1][i] = 1
for i in range(k):
print(sum(days[i]), end= " ")