P5594 【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
一定要注意这句话:
如果在某一天有多个人打同一套模拟赛题,那么教练只需要在这一天准备一场使用这一套题的模拟赛即可。
从上述样例2可以看出,第4个人和第6个人,都在第1天有空,并且他们都打的是第1场模拟赛,所以最后输出第1天只需准备1场。
-
定义一个数组
a[i][j]
:i
表示第i
个人,j
表示第j
天。a[i][j]
的值为第i
个人第j
天打的模拟赛的编号。 -
**定义一个布尔型数组b:**判断某人是否已经打过某场模拟赛。
for(int i = 1; i <= n; i++) {
for(int j = 1; j <= m; j++) {
cin>>x;
a[i][x] = j;
}
}
- 表示第
i
个人第x
天打的模拟赛编号。
b[0] = 1;
for(int i = 1; i <= k; i++) {
for(int j = 1; j <= m; j++) {
b[j] = 0;
}
int ans = 0;
for(int j = 1; j <= n; j++) {
if(!b[a[j][i]]) {
b[a[j][i]] = 1;
ans++;
}
}
cout<<ans<<" ";
}
if(!b[a[j][i]])
:如果b[a[j][i]]
为false
,表示第j
个人在第i
天没做过编号为a[j][i]
的模拟赛卷子,则!b[a[j][i]]
为true
,条件成立,将其标记为已做过b[a[j][i]] = 1
;并对统计变量ans
进行计数ans++;
。
代码:
#include <iostream>
using namespace std;
int n,m,k,x;
int a[1005][1005];
bool b[1005];
int main()
{
cin>>n>>m>>k;
for(int i = 1; i <= n; i++) {
for(int j = 1; j <= m; j++) {
cin>>x;
a[i][x] = j;
}
}
b[0] = 1;
for(int i = 1; i <= k; i++) {
for(int j = 1; j <= m; j++) {
b[j] = 0;
}
int ans = 0;
for(int j = 1; j <= n; j++) {
if(!b[a[j][i]]) {
b[a[j][i]] = 1;
ans++;
}
}
cout<<ans<<" ";
}
return 0;
}