专栏文章

4.8错题总结

个人记录参与者 1已保存评论 0

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
0 条
当前快照
1 份
快照标识符
@mipnz0v0
此快照首次捕获于
2025/12/03 15:06
3 个月前
此快照最后确认于
2025/12/03 15:06
3 个月前
查看原文

T2(P1234 小 A 的口头禅)

考试思路:统计以a[i][j]为头能组成的"hehe"的数量

考试代码:
CPP
#include<bits/stdc++.h>
using namespace std;
char a[1005][1005];
int n,m,ans;
int main()
{
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	cin>>n>>m;
	for(int i=1;i<=n;i++)
		for(int j=1;j<=m;j++)
			cin>>a[i][j];
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=m;j++)
		{
			if(j+3<=m)
			{
				if(a[i][j]=='h'&&a[i][j+1]=='e'&&a[i][j+2]=='h'&&a[i][j+3]=='e')
					ans++;
			}
			if(j-3>=1)
			{
				if(a[i][j]=='e'&&a[i][j-1]=='h'&&a[i][j-2]=='e'&&a[i][j-3]=='h')
					ans++;
			}
			if(i+3<=n)
			{
				if(a[i][j]=='h'&&a[i+1][j]=='e'&&a[i+2][j]=='h'&&a[i+3][j]=='e')
					ans++;
			}
			if(i-3>=1)
			{
				if(a[i][j]=='e'&&a[i-1][j]=='h'&&a[i-2][j]=='e'&&a[i-3][j]=='h')
					ans++;
			}
		}
	}
	cout<<ans<<'\n';
	return 0;
}

错误原因:没考虑周全

正确思路:找到h就判断四个方向是否有"hehe",有多少个就加多少个

正确代码:
CPP
#include<bits/stdc++.h>
using namespace std;
int n,m,ans;
char a[1005][1005];
int main()
{
	cin>>n>>m;
	for(int i=1;i<=n;i++)
		for(int j=1;j<=m;j++)
			cin>>a[i][j];
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=m;j++)
		{
			if(a[i][j]=='h')
			{
				if(a[i-1][j]=='e'&&a[i-2][j]=='h'&&a[i-3][j]=='e')
					ans++;
		        if(a[i+1][j]=='e'&&a[i+2][j]=='h'&&a[i+3][j]=='e')
		        	ans++;
		        if(a[i][j-1]=='e'&&a[i][j-2]=='h'&&a[i][j-3]=='e')
		        	ans++;
		        if(a[i][j+1]=='e'&&a[i][j+2]=='h'&&a[i][j+3]=='e')
		        	ans++;
			}
		}
	}
	cout<<ans;
	return 0;
}

T5(P11380 [GESP202412 八级] 排队)

考试思路:把输出0的分拿了,再把结果小于1000000007,的分拿了

考试代码:
CPP
#include<bits/stdc++.h>
using namespace std;
const int mod=1e9+7;
map<int,int>mp;
int n,m,ans=1;
int main()
{
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	cin>>n>>m;
	for(int i=1;i<=m;i++)
	{
		int u,v;
		cin>>u>>v;
		if(mp[u]==v||mp[v]==u)
		{
			cout<<0;
			return 0;
		}
		mp[u]=v;
		mp[v]=u;
	}
	for(int i=1;i<=n-m;i++)
	{
		ans*=i;
		ans%=mod;
	}
	cout<<ans<<'\n';
	return 0;
}

错误原因:没时间写了

正确思路:并查集

正确代码:
CPP
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N=2e5+1,MOD=1e9+7;
int fa[N],l[N],r[N],n,m,ans=0,sum=1,F=0;
struct stu
{
	int a1,a2,f;
}a[N];
int Father(int x)
{
	if(fa[x]!=x)
		return fa[x]=Father(fa[x]);
	return x;
}
bool comp(stu b1,stu b2)
{
	if(b1.a1==b2.a1&&b1.a2==b2.a2&&b1.f!=b2.f)
		F=1;
	if(b1.a1==b2.a1)
		return b1.a2<b2.a2;
	return b1.a1<b2.a1;
}
signed main()
{
	cin>>n>>m;
	for(int i=1;i<=n;++i)
		fa[i]=i;
	for(int i=1,x,y;i<=m;++i)
	{
		cin>>x>>y;
		if(r[x]==y||l[y]==x)
			continue;
		if(r[x]||l[y]||Father(x)==Father(y))
		{
			cout<<"0";
			return 0;
		}
		r[x]=y;
		l[y]=x;
		fa[Father(y)]=Father(x);
	}
	for(int i=1;i<=n;++i)
		ans+=(Father(i)==i);
	for(int i=1;i<=ans;++i)
		sum=(sum*i)%MOD;
	cout<<sum;
	return 0;
}

T6(P1205 [USACO1.2] 方块转换 Transformations)

考试思路:每种都判断一遍

考试代码:
CPP
#include<bits/stdc++.h>
using namespace std;
int n;
char a[15][15],b[15][15],yq[15][15];
void xz()
{
	for(int i=1;i<=n;i++)
		for(int j=1;j<=n;j++)
			b[i][j]=a[j][n-i+1];
	for(int i=1;i<=n;i++)
		for(int j=1;j<=n;j++)
			a[i][j]=b[i][j];
}
bool pd()
{
	for(int i=1;i<=n;i++)
		for(int j=1;j<=n;j++)
			if(a[i][j]!=yq[i][j])
				return 1;
	return 0;
}
void fz()
{
	for(int i=1;i<=n;i++)
		for(int j=1;j<=n;j++)
			b[i][j]=a[i][n-j+1];
	for(int i=1;i<=n;i++)	
		for(int j=1;j<=n;j++)
			a[i][j]=b[i][j];
}
int main()
{
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	cin>>n;
	for(int i=1;i<=n;i++)
		for(int j=1;j<=n;j++)
			cin>>a[i][j];
	for(int i=1;i<=n;i++)
		for(int j=1;j<=n;j++)
			cin>>yq[i][j];
	if(pd()==0)
	{
		cout<<6;
		return 0;
	}
	xz();
	if(pd()==0)
	{
		cout<<3;
		return 0;
	}
	xz();
	if(pd()==0)
	{
		cout<<2;
		return 0;
	}
	xz();
	if(pd()==0)
	{
		cout<<1;
		return 0;
	}
	xz();
	fz();
	if(pd()==0)
	{
		cout<<4;
		return 0;
	}
	xz();
	if(pd()==0)
	{
		cout<<5;
		return 0;
	}
	xz();
	if(pd()==0)
	{
		cout<<5;
		return 0;
	}
	xz();
	if(pd()==0)
	{
		cout<<5;
		return 0;
	}
	cout<<7;
	return 0;
}

错误原因:要按先后顺序来输出符合的

正确思路:按顺序判断一遍

正确代码:
CPP
#include<bits/stdc++.h>
using namespace std;
int n,mn=100;
char a[15][15],b[15][15],yq[15][15];
void xz()
{
	for(int i=1;i<=n;i++)
		for(int j=1;j<=n;j++)
			b[i][j]=a[j][n-i+1];
	for(int i=1;i<=n;i++)
		for(int j=1;j<=n;j++)
			a[i][j]=b[i][j];
}
bool pd()
{
	for(int i=1;i<=n;i++)
		for(int j=1;j<=n;j++)
			if(a[i][j]!=yq[i][j])
				return 1;
	return 0;
}
void fz()
{
	for(int i=1;i<=n;i++)
		for(int j=1;j<=n;j++)
			b[i][j]=a[i][n-j+1];
	for(int i=1;i<=n;i++)	
		for(int j=1;j<=n;j++)
			a[i][j]=b[i][j];
}
int main()
{
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	cin>>n;
	for(int i=1;i<=n;i++)
		for(int j=1;j<=n;j++)
			cin>>a[i][j];
	for(int i=1;i<=n;i++)
		for(int j=1;j<=n;j++)
			cin>>yq[i][j];
	xz();
	if(pd()==0)
		mn=min(mn,3);
	xz();
	if(pd()==0)
		mn=min(mn,2);
	xz();
	if(pd()==0)
		mn=min(mn,1);
	xz();
	fz();
	if(pd()==0)
		mn=min(mn,4);
	xz();
	if(pd()==0)
		mn=min(mn,5);
	xz();
	if(pd()==0)
		mn=min(mn,5);
	xz();
	if(pd()==0)
		mn=min(mn,5);
	xz();
	fz();
	if(pd()==0)
		mn=min(mn,6);
	if(mn==100)
		cout<<7;
	else
		cout<<mn;
	return 0;
}

评论

0 条评论,欢迎与作者交流。

正在加载评论...