2022蓝桥杯暑假练习赛3

Posted 斗奋力努

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2022蓝桥杯暑假练习赛3相关的知识,希望对你有一定的参考价值。

2022蓝桥杯暑假练习赛3

全是暴力或模拟

题目:
1、试题 算法提高 栅格打印问题

解题方法:
1、特判掉(n<=1&&m<=1)的特殊情况
2、总共需要输出2n+1行,2m+1列。 根据题意输出时讨论当前行列的奇偶就行了。

#include<bits/stdc++.h>
using namespace std;
int n,m;
int main(){
    cin>>n>>m;
    if(n<=1&&m<=1) return 0;
    for(int i=1;i<=2*n+1;i++){
        for(int j=1;j<=2*m+1;j++){
            if(i%2==1){
                if(j%2==1) printf("+");
                else printf("-");
            }
            else{
                if(j%2==0) printf(" ");
                else printf("|");
            }
        }
        printf("\\n");
    }
}

---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

2、试题 算法训练 暗恋

解题方法:
1、题目要求的是最大纯色正方形,所以可能是由一个全1的正方形构成,也可能是由一个全0的正方形构成。
2、数据小,直接暴力O( n 3 n^3 n3)就可以水过去。对于每个点都考虑将其作为正方形的左上角的时候,可能构成的最大纯色正方形,不断更新最大边长ans,最后输出面积就行了。

#include<bits/stdc++.h>
using namespace std;
int r,c;
int mp[205][205];
int maxn,ans;

bool check(int x,int y,int le){
	int sum=0;
	for(int i=x;i<x+le;i++){
		for(int j=y;j<y+le;j++){
			if(mp[x][y]!=mp[i][j]) return false;
		}
	}
	return true;
}

void solve(){
	for(int i=1;i<=r;i++){
		for(int j=1;j<=c;j++){
			for(int len=ans+1;len<maxn;len++){
				if(i+len-1<=r&&j+len-1<=c){
					if(check(i,j,len)) ans=len;
				}
				else break;
			}
		}
	}
	cout<<ans*ans<<"\\n";
}

int main(){
	cin>>r>>c;
	for(int i=1;i<=r;i++){
		for(int j=1;j<=c;j++){
			cin>>mp[i][j];
		}
	}
	maxn=max(r,c);
	solve();
}

---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

3、试题 算法提高 大数加法

解题方法:
C++:直接模拟加法
Python:输入输出

#include<bits/stdc++.h>
using namespace std;
string s1,s2;
int a[1100],b[1100],c[1100];
int j=0,len;
int main()
{
	cin>>s1>>s2;
	for(int i=s1.length()-1;i>=0;i--)
	{
		a[j++]=s1[i]-'0';
	}
	j=0;
	for(int i=s2.length()-1;i>=0;i--)
	{
		b[j++]=s2[i]-'0';
	}
	int len=max(s1.length(),s2.length());
	int i,t=0;
	c[0]=(a[0]+b[0])%10;
	if(a[0]+b[0]>=10)
	{
		t=1;
	}
	for(i=1;i<len;i++)
	{
		int k;
		k=a[i]+b[i]+t;
		if(k>=10)
		{
			t=1;
			c[i]=k%10;
		}
		else
		{
			t=0;
			c[i]=k;
		}
	}
	if(a[len-1]+b[len-1]+t>=10) cout<<"1";
	for(int i=len-1;i>=0;i--)
	{
		cout<<c[i];
	}
}
a = int(input())
b = int(input())
print(a + b)

---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

4、试题 算法训练 黑白无常

解题方法:
最多n=8,直接考虑二进制,用0~((1<<n)-1)表示所有可能的情况,然后暴力判断每种情况就行了。

#include<bits/stdc++.h>
using namespace std;
int n;
int num[10];
int wh[10],bl[10];
int bi[10];

bool check(int x,int co){
    int h=0,b=0;
    for(int i=0;i<n;i++){
        if(i==x) continue;
        if(bi[i]==1) b++;
        else h++;
    }
    if(co==1){
        if(b==wh[x]&&h==bl[x]) return true;
        else return false;
    }
    else{
        if(b==wh[x]&&h==bl[x]) return false;
        else return true;       
    }
}

int main(){
    scanf("%d",&n);
    for(int i=0;i<n;i++) num[i]=i;
    for(int i=0;i<n;i++) cin>>wh[i]>>bl[i];
    for(int i=0;i<(1<<n);i++){
        bool f=true;
        for(int j=0;j<n;j++) bi[j]=(i>>j)&1;
        for(int j=0;j<n;j++){
            f=f&&check(j,bi[j]);
        }
        if(f){
            int t=0;
            for(int j=0;j<n;j++){
                if(bi[j]==1){t=1;printf("%d",j+1);}
            }
            if(t==0) printf("0\\n");
            return 0;
        }
    }
    puts("NoSolution.");
}

---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

4、试题 算法提高 班级排名

解题方法:
题目要求每次统计完一门科目后,就输出一次DaDa的排名。
数据小,我们用map<string,int>来记录每个人的成绩,然后每次统计完一门科目后,取暴力获取当前排名。最后统一输出。

#include<bits/stdc++.h>
using namespace std;
int n,m,k,now;
string s;
map<string,int>mp;
int res[105],num;

int main(){
    cin>>n;
    for(int i=1;i<=n;i++){
        cin>>s;
        mp[s]=0;
    }
    cin>>m;
    for(int i=1;i<=m;i++){
        int cnt=0;
        for(int j=1;j<=n;j++){
            cin>>k>>s;
            mp[s]+=k;
            if(s=="DaDa") now=mp[s];
        }
        map<string,int>::iterator it;
        for(it=mp.begin();it!=mp.end();it++){
            if(it->second>now) cnt++;
        }
        res[++num]=cnt+1;
    }
    for(int i=1;i<=m;i++) printf("%d\\n",res[i]);
}

---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

6、试题 算法提高 棋盘多项式

解题方法:
八皇后的变式。
直接dfs,对于每个新到达的值为1的点,我们只考虑其上边和左边是否已经由车可以影响到该点,不能就标记该点,否则跳过。
每次如果棋盘上已经有当前考虑车的个数now,就做出贡献1,并返回。

#include<bits/stdc++.h>
using namespace std;
int n,cnt,res;
int mp[10][10];
bool vis[10][10];

bool check(int x,int y){
    if(mp[x][y]==0) return false;
    for(int i=x;i>=1&&mp[i][y]!=0;i--) if(vis[i][y]) return false;
    for(int j=y;j>=1&&mp[x][j]!=0;j--) if(vis[x][j]) return false;
    return true;
}

void dfs(int x,int y,int now){
    if(now==res){
        cnt++;
        return;
    }
    if(y==n+1){x++,y=1;}
    if(x==n+1)return;
    dfs(x,y+1,now);
    if(check(x,y)){
        vis[x][y]=1;
        dfs(x,y+1,now+1);
        vis[x][y]=0;
    }
}

int main(){
    cin>>n;
    for(int i=1;i<=n;i++){
        for(int j=1;j<=n;j++){
            cin>>mp[i][j];
        }
    }
    while(++res){
        cnt=0;
        memset(vis,0,sizeof(vis));
        dfs(1,1,0);
        if(cnt==0) break;
        cout<<cnt<<"\\n";
    }
}

以上是关于2022蓝桥杯暑假练习赛3的主要内容,如果未能解决你的问题,请参考以下文章

2021.5.22 2022蓝桥杯练习赛3

2021.5.29 2022蓝桥杯练习赛4

2021.5.14 2022蓝桥杯练习赛2

PTA2022年蓝桥杯及天梯赛赛前训练(C++练习)

2021.5.7 2022蓝桥杯练习赛1

C++练习2022年蓝桥杯选拔赛