2022河南省ccpc省赛题解

F 集合之和

H 旋转水管

J

2022河南省ccpc省赛题解_第1张图片
比赛的时候没有看到x是从0开始取值的,浪费了大量时间。
每个集合从0开始取值
若取A={0,1,2,3},可得A+A={0,1,2,3,4,5,6}
若A={0,2,3},可得A+A={0,2,3,4,5,6},与上面相比少一个1,但是当n=2和n=4时无论如何也推不出来,我们可以得知,当A中有n个元素时,A+A最多有n(n+
1)/2个元素,最少可以得到2n-1个元素,当n等于2时,3<=A+A<=3;当n等于3时 5<=A+A<=6,所以n=2和n=4无解

#include
using namespace std;
int main()
{
	int n,i,j,k;
	scanf("%d",&n);
	if(n==2||n==4)
	printf("-1\n");
	else
	{
		printf("%d\n",n/2+(n%2?1:0));
		if(n%2)
		{
			for(i=0;i<=n/2;i++)
			{
				printf("%d\n",i);
			}
		}
		else
		{
			for(i=0;i<=n/2;i++)
			{if(i==1)
				continue;
				printf("%d\n",i);	
			}
		
		}
	}
}

H

这题是这次比赛最大的痛点,先不说j题没注意到从0开始,这题没注意到memset这个玩意,大一的时候还记得它有时候会超时,比赛的时候怎么都没想起来,把这一点一改就过去了,我永远永远永远都会记得了,memset这个东西!!!!!!!

#include
using namespace std;
const int N=1e5+10;
char s[5][N];
int book[5][N],sy,ey,m,flag=0;
void dfs(int x,int y,int fr)
{
	int i;
	if(x==4&&y==ey)
	{
		flag=1;
		return ;
	}
	if(book[x][y])
	return ;
	if(x<=1||x>4||y<1||y>m)
	return ;
	book[x][y]=1;
	if(s[x][y]=='I')
	{
		if(fr==1)
		dfs(x,y+1,1);
		if(fr==2)
		dfs(x+1,y,2);
		if(fr==3)
		dfs(x,y-1,3);
		if(fr==4)
		dfs(x-1,y,4);
	}
	if(s[x][y]=='L')
	{
		if(fr==1)
		{
			dfs(x+1,y,2);
			dfs(x-1,y,4);
		}
		if(fr==2)
		{
			dfs(x,y+1,1);
			dfs(x,y-1,3);
		}
		if(fr==3)
		{
			dfs(x-1,y,4);
			dfs(x+1,y,2);
		}
		if(fr==4)
		{
			dfs(x,y+1,1);
			dfs(x,y-1,3);
		}
	}
	book[x][y]=0;
	return ;
}
int main()
{
	int t;
	scanf("%d",&t);
	while(t--)
	{
	scanf("%d",&m);
	scanf("%d%d",&sy,&ey);
	flag=0;
//	memset(book,0,sizeof(book));
	for(int i=2;i<=3;i++)
	{
		scanf("%s",s[i]+1);
		for(int j=1;j<=m;j++)
		book[i][j]=0;
	}
	dfs(2,sy,2);
	if(flag)
	printf("YES\n");
	else
	printf("NO\n"); 	
	}
	
}

你可能感兴趣的:(思维,深度优先,算法,图论)