CCPC-Wannafly Winter Camp Day7 (Div2, onsite) G 抢红包机器人

题目描述

 

众所周知,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 
using namespace std;

const int maxn=100+5;
int n,m,k;

std::vector 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;
}

 

你可能感兴趣的:(camp)