[CRCI2006-2007] BARD
题目描述
有一个小村子,村子里共有 n n n 个人,不妨将这 n n n 个人从 1 1 1 至 n n n 编号,编号为 1 1 1 的人是诗人。
每天晚上都会有一些村民围在篝火旁唱歌。
如果某天晚上诗人来了,那么诗人会编一首所有人都没有听过的新歌曲并教给大家唱。在这天晚上不会唱其他任何歌曲。
如果某天晚上诗人没来,那么与会者就会唱他们之中至少有一个人会唱的所有歌曲,并把这些歌曲教给那些来了但不会唱的人。
给定 m m m 天晚上参与唱歌的村民的编号,初始时村民们什么都不会唱,诗人一首歌也没有写。请输出最终有多少村民会唱诗人写的所有歌。
输入格式
第一行有一个整数,表示村民的数量 n n n。
第二行有一个整数,表示夜晚的数量 m m m。
第
3
3
3 到第
(
m
+
2
)
(m + 2)
(m+2) 行,每行描述一个夜晚,第
(
i
+
2
)
(i + 2)
(i+2) 行描述第
i
i
i 个晚上的情况:
该行首先有一个整数
k
i
k_i
ki,表示该晚上来了
k
i
k_i
ki 个村民,然后有
k
i
k_i
ki 个互不相同的整数
a
i
,
j
a_{i, j}
ai,j,分别表示来了的村民的编号。
输出格式
输出若干行,每行一个整数,以升序输出每一个会所有歌的村民的编号。
样例 #1
样例输入 #1
4
3
2 1 2
3 2 3 4
3 4 2 1
样例输出 #1
1
2
4
样例 #2
样例输入 #2
8
5
4 1 3 5 4
2 5 6
3 6 7 8
2 6 2
4 2 6 8 1
样例输出 #2
1
2
6
8
样例 #3
样例输入 #3
5
3
2 1 3
2 2 1
4 2 1 4 5
样例输出 #3
1
提示
数据规模与约定
对于全部的测试点,保证:
- $ 1 \leq n \leq 100$, 1 ≤ m ≤ 50 1 \leq m \leq 50 1≤m≤50。
- 2 ≤ k i ≤ n 2 \leq k_i \leq n 2≤ki≤n, 1 ≤ a i , j ≤ n 1 \leq a_{i, j} \leq n 1≤ai,j≤n。 1 1 1 在 a i , j a_{i, j} ai,j 中至少出现了一次。
说明
题目译自 COCI2006-2007 Regional Competition T1 BARD,翻译来自 @一扶苏一。
C++实现
#include<bits/stdc++.h>
using namespace std;
int n,m,song[101][101],s,k,come[101],v[101];
int main()
{
cin>>n>>m;
for(int i=1,o=0;i<=m;i++,o=0){
cin>>k;
for(int j=1;j<=k;j++){
cin>>come[j];
if(come[j]1)o=1;
}
if(o) {
++s;
for(int j=1;j<=k;j++)
song[come[j]][s]=1;
}
else
{
for(int j=1;j<=k;j++)
for(int u=1;u<=s;u++)
if(song[come[j]][u])v[u]=1;
for(int j=1;j<=k;j++)
for(int u=1;u<=s;u++)
if(v[u])song[come[j]][u]=1;
}
}
for(int i=1;i<=n;i++)
for(int j=1;j<=s&&song[i][j];j++)
if(js)cout<<i<<endl;
return 0;
}
后续
接下来我会不断用C++来实现信奥比赛中的算法题、GESP考级编程题实现、白名单赛事考题实现,记录日常的编程生活、比赛心得,感兴趣的请关注,我后续将继续分享相关内容