题目描述
众所周知,camp群里有很多抢红包的机器人,wls对这种号感到很愤怒,他决定把这些机器人全部找出来后踢掉。
wls 研究后发现,由于人的手速是拼不过脚本的,所以如果某个号在某个红包里抢得比某个机器人快,那么这个号肯定也是机器人。
现在 wls 想知道,在群里一定有机器人的情况下,camp 群里至少有几个机器人。
注:机器人并不是每次都会抢红包,而且由于网速问题机器人抢红包的速度也不是固定的,所以有可能有时机器人 a 比 b 快,有时 b 比 a 快。
输入描述
第一行两个正整数 n,mn,m,分别表示群员数量和 wls 发的红包数量
接下来 mm 行,描述这 mm 个红包,每行一开始一个正整数 kk,表示抢了这个红包的人的数量,之后 kk 个互不相同的 [1,n][1,n] 内的正整数,表示按照先后顺序给出了抢这个红包的群员的编号。
1\leq n,m\leq 1001≤n,m≤100,1\leq k\leq n1≤k≤n
输出描述
输出一个整数,表示群里至少有几个机器人
样例输入 1
4 2 3 1 2 3 2 3 1
样例输出 1
1
因为至少有一个机器人,所以直接暴力枚举1~n为机器人,只要在机器人之前抢到红包,则这个人也一定是机器人
最后取个min就行了
#include <bits/stdc++.h>
using namespace std;
const int maxn=100+5;
int n,m,k;
std::vector<int> v[maxn];
int main(int argc, char const *argv[])
{
scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++)
{
scanf("%d",&k);
for(int j=1;j<=k;j++)
{
int x;
scanf("%d",&x);
v[i].push_back(x);
}
}
int ans=110;
for(int bot=1;bot<=n;bot++)
{
int cnt=1;
bool vis[maxn];
memset(vis,false,sizeof(vis));
vis[bot]=true;
for(int i=1;i<=m;i++)
{
int flag=0;
for(int j=v[i].size()-1;j>=0;j--)
{
if(vis[v[i][j]])
{
flag=1;
}
if(flag&&v[i][j]!=bot&&!vis[v[i][j]])
{
cnt++;
vis[v[i][j]]=true;
}
}
}
ans=min(ans,cnt);
}
printf("%d\n",ans );
return 0;
}