F 集合之和
H 旋转水管
J
比赛的时候没有看到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<bits/stdc++.h>
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<bits/stdc++.h>
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");
}
}