题目大意:
一共有N个娃娃,我们的目的就是将所有的娃娃串在一起。
我们需要保证从左到右的娃娃的编号是递增的才行。
我们有两种操作:
①拆出当前串中最大编号的娃娃(且一定是最右边的娃娃)。
②连接一个单个的娃娃(不能和其他娃娃相连着的娃娃)。
问最少操作次数,使得所有娃娃串在一起。
思路:
1、根据题目要求可知,如果当前这一串娃娃的起点不是 1,那么显然这一整串是一定需要拆开的,操作次数为:这一串娃娃的个数-1.
如果当前这一串娃娃的起点是1,但是之后的娃娃不是以a【i】-a【i-1】==1的形式递增的,那么后边的部分也要拆开。
2、将所有的娃娃都拆开了之后,我们再将每个娃娃一个一个的搭上去即可。
Ac代码:
#include<stdio.h>
#include<queue>
#include<string.h>
using namespace std;
int main()
{
int n,m;
while(~scanf("%d%d",&n,&m))
{
int output=0;
int len=0;
for(int i=0;i<m;i++)
{
int k;
int flag=0;
scanf("%d",&k);
for(int j=0;j<k;j++)
{
int x;
scanf("%d",&x);
if(j==0&&x==1)flag=1,len=1;
if(j>0&&flag==0)output++;
if(j>0&&flag==1)
{
if(j==x-1)
{
len++;
}
else
{
flag=0;
output++;
}
}
}
}
printf("%d\n",output+n-len);
}
}