一般路人向第40次CCF-CSP认证(275/500)

官方解析:https://dl.ccf.org.cn/video/videoDetail.html?id=7808351746705408

考试前一天:怎么这次还是一般路人向?从CSP39以来一直有一个练算法的冲动,,,仅仅是冲动。直到考试前一天我去来不及了。凉拌吧。练了练大模拟,全都不会做hhh,上考场了。

考试当天:ohno起晚了,去印资料、吃个饭,到考点只剩十分钟不到了。进考场之后发现自己考位的电脑居然没有电脑鼠标,老师也找不到,寄。过了会儿老师拿了俩键盘鼠标回来给其他同学了,原来别人还有相同状况的。接着我再跟老师说,老师再去给找,拿来赶紧插上开机,正好 13:30 ,比赛开始,立马断网,没法配 vs 或者 vscode 的环境,只好拿起来快两年没碰的 dev c++ 了。最后十分钟在做 T4 前 30% 点的枚举,可惜这台神奇的机器上 dev c++ 编译运行一次几乎需要十秒钟,最终遗憾离场。
长记性了吧。早点去比什么都好。

仅代码,题解待更新。

T1 (100)

#include<stdio.h>
int xorcmp(int*a, int*b, int*set)
{
	int x=set[a[1]];
	int y=set[b[1]];
	for(int i=2;i<=a[0];i++)
	{
		x=x^set[a[i]];
	}
	for(int i=2;i<=b[0];i++)
	{
		y=y^set[b[i]];
	}
	if(x==y)
	{
		return 1;
	}
	else
	{
		return 0;
	}
}
int realcmp(int* a, int* b, int*set)
{
	if(set[a[0]]!=set[b[0]])
	{
		return 0;
	}
	else
	{
		for(int i=1;i<=a[0];i++)
		{
			if(set[a[i]]!=set[b[i]])
			{
				return 0;
			} 
		}
		return 1;
	}
}
int m,n;
int a[10005];
int s[105][10005];
int t[105][10005];
int main()
{
	scanf("%d %d",&n, &m);
	for(int i=1;i<=n;i++)
	{
		scanf("%d", &a[i]);
	}
	for(int i=1;i<=m;i++)
	{
		scanf("%d", &s[i][0]);
		for(int j=1; j<=s[i][0]; j++)
		{
			scanf("%d", &s[i][j]);
		}
	}
	for(int i=1;i<=m;i++)
	{
		scanf("%d", &t[i][0]);
		for(int j=1; j<=t[i][0]; j++)
		{
			scanf("%d", &t[i][j]);
		}
	}
	for(int i=1;i<=m;i++)
	{
		if(realcmp(s[i],t[i],a)==xorcmp(s[i],t[i],a))
		{
			printf("correct\n");
		}
		else
		{
			printf("wrong\n");
		} 
	}
	return 0; 
}

T2 (100)

#include<stdio.h>
void toeight(int n, int *n1, int*n2,int*n3)
{
	*n3=n%8;
	n=n/8;
	*n2=n%8;
	n=n/8;
	*n1=n%8;
}
int f(int n, int k)
{
	return ((n*n+k*k)%8)^k;
}
int m,n;
int k[1005];
int qst[500005];
int res[520]; 
int a,b,c;
int a0,b0,c0;
int main()
{
	scanf("%d %d", &n, &m);
	for(int i=1;i<=m;i++)
	{
		scanf("%d", &k[i]);
	}
	for(int i=1;i<=n;i++)	
	{
		scanf("%d", &qst[i]);
	}
	for(int i=0;i<512;i++)
	{
		toeight(i,&a,&b,&c);
		
		for(int j=1;j<=m;j++)
		{
			a0=a;
			b0=b;
			c0=c;
			a=b;
			b=c0^f(b0,k[j]);
			c=a0^f(c0,k[j]);
		} 
		res[i]=a*64+b*8+c;
	}
	for(int i=1;i<=n;i++)
	{
		for(int j=0;j<512;j++)
		{
			if(res[j]==qst[i])
			{
				printf("%d ",j);
			}
		}
	}
	return 0;
}

T3 (75)

效率不高,有 25% 的大样例 TLE。

#include<stdio.h>
int z,knum;
int n,m;
char a[405][405];
int t,op,u,v,l,d,r,o;
char aold[405][405];
int k[50005][6];
void shun(char a[][405],char aold[][405],int z,int u,int v, int l)
{
	for(int i=u;i<u+l;i++)
	{
		for(int j=v;j<v+l;j++)
		{
			aold[i][j]=a[i][j];
		}
	}
	for(int i=u;i<u+l;i++)
	{
		for(int j=v;j<v+l;j++)
		{
			a[j-v+u][u+v+l-1-i]=aold[i][j];
		}
	}
}
void ni(char a[][405],char aold[][405],int z,int u,int v, int l)
{
	for(int i=u;i<u+l;i++)
	{
		for(int j=v;j<v+l;j++)
		{
			aold[i][j]=a[i][j];
		}
	}
	for(int i=u;i<u+l;i++)
	{
		for(int j=v;j<v+l;j++)
		{
			a[v+u+l-1-j][i-u+v]=aold[i][j];
		}
	}	
}
void decode1(char a[][405],char aold[][405],int z,int u,int v,int l,int d,int r)
{
	for(int i=1;i<=r;i++)
	{
		shun(a,aold,z,1,1,z);
	}
	for(int i=1;i<=d/90;i++)
	{
		ni(a,aold,z,u,v,l);
	}
}
void decode2(char a[][405],char aold[][405],int z,int u,int d, int l, int r, int o)
{
	if(o==1)
	{
		for(int i=u;i<=d;i++)
		{
			for(int j=l;j<=r;j++)
			{
				aold[i][j]=a[i][j];
			}
		}
		for(int i=u;i<=d;i++)
		{
			for(int j=l;j<=r;j++)
			{
				a[u+d-i][j]=aold[i][j];
			}
		}
	}
	else
	{
		for(int i=u;i<=d;i++)
		{
			for(int j=l;j<=r;j++)
			{
				aold[i][j]=a[i][j];
			}
		}
		for(int i=u;i<=d;i++)
		{
			for(int j=l;j<=r;j++)
			{
				a[i][l+r-j]=aold[i][j];
			}
		}
	}
}
int main()
{
	scanf("%d",&z);
	for(int i=1;i<=z;i++)
	{
		scanf("%s",&a[i][1]); 
	}
	scanf("%d",&knum);

		scanf("%d",&t);
		for(int j=1;j<=t;j++)
		{
			scanf("%d %d %d %d %d %d",&k[j][0],&k[j][1],&k[j][2],&k[j][3],&k[j][4],&k[j][5]); 
		}
		for(int j=t;j>=1;j--)
		{
			if(k[j][0]==1)
			{

					decode1(a,aold,z,k[j][1],k[j][2],k[j][3],k[j][4],k[j][5]);

			}
			else
			{
					decode2(a,aold,z,k[j][1],k[j][2],k[j][3],k[j][4],k[j][5]);
			}
		}
	for(int i=z;i>=1;i--)
	{
		if(a[i][1]!='?')
		{
			n=i;
			break;
		}
	}

	for(int i=z;i>=1;i--)
	{
		if(a[1][i]!='?')
		{
			m=i;
			break;
		}
	}
	for(int i=1;i<=z;i++)
	{
		a[i][m+1]='\0';
	}
	printf("%d %d\n",n,m);
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=m;j++)
		{
			printf("%c",a[i][j]);
		}
		printf("\n");
	}

	return 0;
}

posted on 2025-12-21 00:54  汐寻  阅读(0)  评论(0)    收藏  举报