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

自己写的代码,不能保证全部正确


试题 A: 2022

比赛时没想出来怎样写


试题 B: 钟表

比赛时没想出来怎样写


试题 C: 卡牌

二分法求结果

#include
#include
#include
using namespace std;
const int N=200010;
int a[N],b[N],n,m;
int p(int x)
{
	int i,num=0;
	for(i=1;i<=n;i++)
	{
		if(a[i]+b[i]>=x)
		{
			if(x>a[i]) num+=x-a[i];
		}
		else return 0;
	}
	if(num<=m) return 1;
	return 0;
}
int main()
{
	int i,j,l,r,mid;
	scanf("%d %d",&n,&m);
	for(i=1;i<=n;i++)
		scanf("%d",&a[i]);
	for(i=1;i<=n;i++)
		scanf("%d",&b[i]);
	l=1;
	r=n+m;
	while(l<r)
	{
		mid=(l+r+1)>>1;
//		printf("%d %d %d\n",l,mid,r);
		if(p(mid)) l=mid;
		else r=mid-1;
	}
	printf("%d\n",r);
	return 0;
}

试题 D: 最大数字

字符串存储,从高位到底位,判断1号操作和2号操作那种省步骤,并且是否超过A、B次。

#include
#include
#include
using namespace std;
char a[30];
int main()
{
	int i,x,y,n,b,c;
	scanf("%s %d %d",&a,&b,&c);//b++    c-- 
	for(i=0;a[i]!='\0';i++)
	{
		n=a[i]-'0';
		x=9-n;
		y=10+n-9;
		if(x<y&&b>=x)
		{
			b-=x;
			a[i]='9';
		}
		else if(y<x&&c>=y)
		{
			c-=y;
			a[i]='9';
		}
		else if(b)
		{
			a[i]+=b;
			b=0;
		}
//		printf("%s   %d    %d\n",a,b,c);
	}
	printf("%s",a);
	return 0;
}

试题 E: 出差

用深搜寻找消耗时间最短的路径。注意特判只有一个地点时,结果是0。

#include
#include
#include
using namespace std;
const int N=1010;
const int MOD=999999999;
int a[N][N],book[N],c[N],d[N],n,num;
void dfs(int x)
{
//	printf("*%d\n",x);
	if(x==n)
	{
		num=min(d[x],num);
		return;
	}
	for(int i=2;i<=n;i++)
	{
				
		if(a[x][i]==MOD) continue;
		
		if(d[i]<d[x]+a[x][i]+c[x]) continue;
		d[i]=d[x]+a[x][i]+c[x];
		
		if(d[i]>=num) continue;
		
//		printf("%d\n",i);
		book[i]=1;
		dfs(i);
		book[i]=0;
	}
	return;
}
int main()
{
	int i,j,m;
	scanf("%d %d",&n,&m);
	for(i=1;i<=n;i++)
		scanf("%d",&c[i]);//防控时间 
	for(i=1;i<=n;i++)
	{
		d[i]=MOD;
		for(j=1;j<=n;j++)
		{
			a[i][j]=MOD;
		}
	}
	for(i=1;i<=m;i++)
	{
		int u,v,c1;
		scanf("%d %d %d",&u,&v,&c1);
		a[u][v]=a[v][u]=c1;
	}
	num=MOD;
	book[1]=1;
	for(i=2;i<=n;i++)
	{
		if(a[1][i]==MOD) continue;
		d[i]=min(d[i],a[1][i]);
		book[i]=1;
		dfs(i);
		book[i]=0;
	}
	if(n==1) num=0;
	printf("%d\n",num);
	return 0;
}

试题 F: 费用报销

动态规划,将时间排序,注意判断两个时间的间隔,寻找不超过给定金额的最大值。

#include
#include
#include
using namespace std;
const int N=10010;
struct no
{
	int y;
	int d;
	int v;
}a[N];
bool cmp(no x,no y)
{
	if(x.y==y.y) return x.d<y.d;
	return x.y<y.y;
}
int b[N],k,m;
int p(int x,int y)
{
	if(x>=y) return 0;
//	printf("%d %d\n",x,y);
	int t=0,flag=1;
	int y1=a[x].y;
	int d1=a[x].d;
	while(flag)
	{
		d1++;
		t++;
		if(y1==2&&d1==28) y1++,d1=1;
		else if((y1==4||y1==6||y1==9||y1==11)&&d1==30) y1++,d1=1;
		else if(d1==31) y1++,d1=1;
		if(y1==a[y].y&&d1==a[y].d) flag=0;
		if(t>=k) flag=0;
	}
//	printf("*\n");
//	printf("***********%d %d %d\n",x,y,t);
	if(t>=k) return 1;
	return 0;
}
int s(int x,int y)
{
//	if(abs(x-m)<=abs(y-m)) printf("%d %d %d\n",x,y,x);
//	printf("%d %d %d\n",x,y,y);
	if(x>m) return y;
	if(y>m) return x;
	if(abs(x-m)<=abs(y-m)) return x;
	return y;
}
int main()
{
	int i,j,n,num;
	scanf("%d %d %d",&n,&m,&k);
	for(i=1;i<=n;i++)
		scanf("%d %d %d",&a[i].y,&a[i].d,&a[i].v);
	sort(a+1,a+n+1,cmp);
	for(i=1;i<=n;i++)
		b[i]=s(b[i],a[i].v);
	for(i=1;i<=n;i++)
	{
		for(j=1;j<=n;j++)
		{
			if(p(i,j))
			{
				b[j]=s(b[j],b[i]+a[j].v);
			}
		}
	}
//	for(i=1;i<=n;i++)
//		printf("%d  ",b[i]);printf("\n");
	for(i=1;i<=n;i++)
		num=s(num,b[i]);
	printf("%d",num);
	return 0;
}

试题 G: 故障

思路简单,但是实现比较复杂的模拟。

#include
#include
#include
using namespace std;
const int N=1000;
double a[N][N];
int book[N];
struct no
{
	int x;
	double y;
}c[N];
bool cmp(no x,no y)
{
	if(x.y!=y.y)return x.y>y.y;
	return x.x<y.x;
}
int main()
{
	int i,j,k,n,m;
	scanf("%d %d",&n,&m);
	for(i=1;i<=n;i++)
		scanf("%lf",&a[i][0]);
	for(i=1;i<=n;i++)
	{
		for(j=1;j<=m;j++)
			scanf("%lf",&a[i][j]);
	}
	scanf("%d",&k);
	
	for(i=1;i<=k;i++)
	{
		int num;
		scanf("%d",&num);
		book[num]=1;
	}
//	for(i=1;i<=n;i++)
//		printf("%lf   ",a[i][0]);printf("\n");
	for(i=1;i<=n;i++)
	{
//		printf("%d    ",i);
		for(j=1;j<=m;j++)
		{
			if(book[j]) a[i][0]=a[i][0]*a[i][j]*0.01;//printf("%lf   ",a[i][j]*0.01);
			else a[i][0]=a[i][0]*(100-a[i][j])*0.01;//printf("%lf   ",(100-a[i][j])*0.01);;
		}
//		printf("\n");
	}
	double num=0;
	for(i=1;i<=n;i++)
		num+=a[i][0];
	for(i=1;i<=n;i++)
	{
		c[i].x=i;
		c[i].y=a[i][0]/num;
		c[i].y*=100;
	}
	sort(c+1,c+n+1,cmp);
	for(i=1;i<=n;i++)
		printf("%d %.2lf\n",c[i].x,c[i].y);
	return 0;
}

试题 H: 机房

最后时间不够,直接用Floyd暴力计算,通过30%数据就够了。

#include
#include
#include
using namespace std;
const int N=15010;
const int MOD=99999999;
int a[N][N],b[N][N],c[N],z[N];
int main()
{
	int i,j,k,n,m,x,y,num;
	scanf("%d %d",&n,&m);
	for(i=1;i<n;i++)
	{
		scanf("%d %d",&x,&y);
		a[x][y]=a[y][x]=1;
	}
	for(i=1;i<=n;i++)
		for(j=1;j<=n;j++)
		{
			if(i==j) continue;
			b[i][j]=MOD;
		}
	for(i=1;i<=n;i++)
	{
		num=0;
		for(j=1;j<=n;j++)
			if(a[i][j]) num++;
//		printf("%d    %d\n",i,num);
		z[i]=num;
		for(j=1;j<=n;j++)
			if(a[i][j]) b[i][j]=num;
	}
	for(i=1;i<=n;i++)
	{
		for(j=1;j<=n;j++)
		{
			for(k=1;k<=n;k++)
			{
				if(b[i][j]>b[i][k]+b[k][j])
					b[i][j]=b[i][k]+b[k][j];
			}
		}
	}
//	for(i=1;i<=n;i++)
//	{
//		for(j=1;j<=n;j++)
//			printf("%d ",b[i][j]);
//		printf("\n"); 
//	}
	for(i=1;i<=m;i++)
	{
		scanf("%d %d",&x,&y);
		num=b[x][y]+z[y];
		printf("%d\n",num);
	}
	return 0;
}

试题 I: 齿轮

时间不够


试题 J: 搬砖

时间不够


总结

最后结果是个比较靠后的国二,也算是对得起两年的努力付出。

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