B - Roulette
问题陈述
N人、1人、2人、......人、N人正在玩轮盘赌。一次轮盘赌的结果是从0到36的37个整数中的一个。对于每个i=1,2,...,N,i人在37个可能结果中的Ci个下了注:Ai,1,Ai,2,...,Ai,Ci.
转盘已经转动,结果是X。打印所有投注在X上最少的人的号码,按**由小到大的顺序排列。
更正式地说,打印所有在1和N之间的整数i,这些整数满足以下两个条件,按升序:
- i人在X上下注。
- 对于每个j=1,2,...,N,如果人j投注了X,那么就是Ci≤Cj。
请注意,可能没有要打印的数字(见示例输入 2)。
限制因素
- 1≤N≤100
- 1≤Ci≤37
- 0≤Ai,j≤36
- Ai,1,Ai,2,...,Ai,Ci对每个 i=1,2,...,N来说都是不同的。
- 0≤X≤36
- 所有输入值均为整数。
输入
输入内容由标准输入法提供,格式如下
N
C1
A1,1 A1,2 …… A1,C1
C2
A2,1 A2,2 …… A2,C2
⋮⋮
CN
AN,1 AN,2 …… AN,CN
X
输出
设 B1,B2,...,BK是按升序打印的数字序列。使用以下格式,在第一行打印要打印的数字计数 K,在第二行打印用空格分隔的 B1,B2,...,BK:
K
B1 B2 …… BK
输入样本 1
4
3
7 19 20
4
4 19 24 0
2
26 10
3
19 31 24
19
样本输出 1
2
1 4
转盘已经转动,结果是19。投注19的人有1、2和4,他们投注的次数分别是3、4和3。因此,在投注19的人中,投注最少的是1和4。
输入样本 2
3
1
1
1
2
1
3
0
输出示例 2
0
转盘已经转动,结果是0,但没有人投注0,所以没有数字要打印。
代码
// Problem: B - Roulette
// Contest: AtCoder - AtCoder Beginner Contest 314
// URL: https://atcoder.jp/contests/abc314/tasks/abc314_b
// Memory Limit: 1024 MB
// Time Limit: 2000 ms
//
// Powered by CP Editor (https://cpeditor.org)
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
const int N = 110;
int n;
int a,b,c;
int main(){
cin>>n;
vector<pii> v[40];
for(int i=0;i<n;i++){
cin>>c;
for(int j=0;j<c;j++){
cin>>a;
v[a].push_back({c,i});
}
}
for(int i=0;i<=36;i++){
sort(v[i].begin(),v[i].end());
}
int x;
cin>>x;
if(v[x].size()==0){
cout<<"0\n";
return 0;
}
int minv=v[x][0].first;
vector<int> ve;
for(int i=0;i<v[x].size();i++){
if(v[x][i].first==minv){
ve.push_back(v[x][i].second+1);
}
}
cout<<ve.size()<<"\n";
for(auto i:ve){
cout<<i<<' ';
}
return 0;
}