2022年第十三届蓝桥杯大赛软件类省赛 C/C++ 大学B组

我的代码在acwing上提交,通过数据也是acwing显示的。
数据与官方数据不一定相同。

试题 A: 九进制转十进制

#include
#include
#include
using namespace std;
int main()
{
	int num;
	num=2*9*9*9+0*9*9+2*9+2;
	printf("%d\n",num);
}

试题 B: 顺子日期

#include
#include
#include
using namespace std;
int sum=0;
void dfs(int x,int y)
{
	int a[10];
	a[1]=2;a[2]=0;a[3]=2;a[4]=2;
	a[5]=x/10;a[6]=x%10;
	a[7]=y/10;a[8]=y%10;
	for(int i=1;i<=6;i++)
	{
//		if(a[i]==a[i+1]+1&&a[i]==a[i+2]+2)// printf("2020%02d%02d      %d %d %d %d\n",x,y,i,a[i],a[i+1],a[i+2]);
//		{
//			for(int j=1;j<=8;j++)
//				printf("%d ",a[j]);sum++;
//			printf("    %d\n",sum);
//			
//		}
		if(a[i]==a[i+1]-1&&a[i]==a[i+2]-2)// printf("2020%02d%02d\n",x,y);
		{
			for(int j=1;j<=8;j++)
				printf("%d ",a[j]);sum++;
			printf("    %d\n",sum);
			break;
		}
	}
}
int main()
{
	int i,j,n,m;
	for(i=1;i<=12;i++)
	{
		for(j=1;j<=31;j++)
		{
			if(i==2&&j>28) break;
			if((i==4||i==6||i==9||i==11)&&j>30) break;
			dfs(i,j);
		}
	}
	printf("%d\n",sum);
}

试题 C: 刷题统计

#include
#include
#include
using namespace std;
int main()
{
	long long i,j,n,m,m1;
	long long a,b,n1;
	scanf("%lld %lld %lld",&a,&b,&n);
	m=5*a+2*b;
	m1=n/m;
	n=n%m;
	if(n==0) printf("%lld\n",m1*7);
	else
	{
		for(i=1;i<=7;i++)
		{
			if(i<=5) n=n-a;
			else n=n-b;
			if(n<=0) break;
		}
		printf("%lld\n",m1*7+i);
	}
	return 0;
}

试题 D: 修剪灌木

#include
#include
#include
using namespace std;
const int N=10010;
int a[N],b[N],book[N];
int main()
{
	int i,j,n,m,t;
	scanf("%d",&n);
	for(i=1,t=1;i<=n;i++,t++)
	{
		a[i]=max(a[i],t-book[i]);
		book[i]=t;
	}
	
	for(i=n-1,t=t;i>=1;i--,t++)
	{
		a[i]=max(a[i],t-book[i]);
		book[i]=t;
	}
	for(i=2,t=t;i<=n;i++,t++)
	{
		a[i]=max(a[i],t-book[i]);
		book[i]=t;
	}
	for(i=1;i<=n;i++)
		printf("%d\n",a[i]);
	return 0;
}

试题 E: X 进制减法

#include
#include
#include
using namespace std;
const int N=1010;
long long a[N],b[N],c[N];
int main()
{
	int i,j,k,la,lb;
	scanf("%d",&k);
	scanf("%d",&la);
	for(i=la;i>=1;i--)
		scanf("%lld",&a[i]);
	scanf("%d",&lb);
	for(i=lb;i>=1;i--)
		scanf("%lld",&b[i]);
	c[0]=1;
	for(i=1;i<=la||i<=lb;i++)
	{
		if(a[i]==0&&b[i]!=0) c[i]=b[i]+1;
		else if(a[i]!=0&&b[i]==0) c[i]=a[i]+1;
		else if(a[i]==0&&b[i]==0) c[i]=2;
		else c[i]=max(a[i]+1,b[i]+1);
	}
	for(i=1;i<=la||i<=lb;i++)
	{
		if(a[i]<b[i]) a[i+1]-=1,a[i]+=c[i];
		a[i]=a[i]-b[i];//printf("    %lld\n",a[i]);
	}//printf("\n");
	long long sum=0;
	for(i=la;i>=1;i--)
	{
		sum=a[i]+sum*c[i];
		sum=sum%1000000007;
//		printf("%lld   %lld   %lld\n",a[i],sum,c[i]);
	}
	printf("%lld\n",sum);
	return 0;
}

试题 F: 统计子矩阵

写的不太对,数据没有全通过,通过90%。

#include
#include
#include
using namespace std;
using namespace std;
typedef long long LL;
const int N=510;
LL a[N][N],b[N][N],cnt,n,m,k;
inline LL calc(int x1,int y1,int x2,int y2)
{
    return b[x2][y2]-b[x2][y1-1]-b[x1-1][y2]+b[x1-1][y1-1];
}
int main()
{
    scanf("%lld%lld%lld",&n,&m,&k);
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=m;j++)
        {
            scanf("%lld",&a[i][j]);
            b[i][j]=b[i-1][j]+b[i][j-1]-b[i-1][j-1]+a[i][j];
        }
    }
    for(int l=1;l<=m;l++)//枚举矩阵的左边
    {
        for(int r=l;r<=m;r++)//枚举矩阵的右边
        {
            for(int i=1,j=1;i<=n;i++)//有了左右边界,从上到下双指针扫描
            {
                while(j<=i&&calc(j,l,i,r)>k) j++;
                if(j<=i) cnt+=(i-j+1);//有可能最小的矩阵都不满足,此时j>i
            }
        }
    }
    printf("%lld",cnt);
    return 0;
}

试题 G: 积木画

不会


试题 H: 扫雷

时间超限,通过50%。

#include
#include
#include
using namespace std;
const int N=50010;
struct no
{
	int x;
	int y;
	int r;
}a[N];
int book[N],b[N][9000];
void dfs(int x)
{
	int i,j;
	book[x]=1;
	for(i=1;i<=b[x][0];i++)
	{
//		printf("*****%d\n",b[x][i]);
		if(book[b[x][i]]) continue;
		dfs(b[x][i]);
	}
}
int main()
{
	int i,j,n,m;
	scanf("%d %d",&n,&m);
	for(i=1;i<=n;i++)
		scanf("%d %d %d",&a[i].x,&a[i].y,&a[i].r);
	for(i=1;i<=n;i++)
	{
		for(j=1;j<=n;j++)
		{
			if(i==j) continue;
			if((a[i].x-a[j].x)*(a[i].x-a[j].x)+(a[i].y-a[j].y)*(a[i].y-a[j].y)<=(a[i].r*a[i].r))
			{
				b[i][0]++;
				b[i][b[i][0]]=j;
			}
		}
	}
//	for(i=1;i<=n;i++)
//	{
//		printf("****%d   ",b[i][0]);
//		for(j=1;j<=b[i][0];j++)
//			printf("%d  ",b[i][j]);
//		printf("\n");
//	}
	for(i=1;i<=m;i++)
	{
		int x,y,r;
		scanf("%d %d %d",&x,&y,&r);
		for(j=1;j<=n;j++)
		{
			if(book[j]) continue;
//			printf("*****%d  %d\n",(a[j].x-x)*(a[j].x-x)+(a[j].y-y)*(a[j].y-y),r*r);
			if((a[j].x-x)*(a[j].x-x)+(a[j].y-y)*(a[j].y-y)<=(r*r))
			{
				dfs(j);
			}
		}
	}
	int sum=0;
	for(i=1;i<=n;i++)
		if(book[i]) sum++;
	printf("%d\n",sum);
	return 0;
}

试题 I: 李白打酒加强版

数据太大,只通过10%。

#include
#include
#include
using namespace std;
int n,m,sum,num;
int a[210];
void dfs(int step)
{
	if(step==n+m)
	{
		int n1,m1;
		n1=m1=0;
		for(int i=1;i<=n+m;i++)
		{
			if(a[i]) n1++;
			else m1++;
		}
		if(n1==n&&m1==m)
		{
			long long num=2;
			for(int i=1;i<=n+m;i++)
			{
				if(a[i]) num=num*2;
				else num--;
			}
			if(num==0) sum++;
		}
		return;
	}
	a[step]=1,dfs(step+1);
	a[step]=0,dfs(step+1);
}
int main()
{
	int i,j;
	scanf("%d %d",&n,&m);//n店,m花 
	a[1]=1,dfs(2);//n,店 
	a[1]=0,dfs(2);//m,花 
	printf("%d\n",sum);
	return 0;
}

试题 J: 砍竹子

不会


总结

这次最大的问题就是数据范围没有看准,有的数据范围是105但是我只开了103
以后绝对不可以出现这样的重大事故。
最终结果还可以省一。

你可能感兴趣的:(蓝桥杯,我的ACM之路,蓝桥杯,c语言,c++)