第一次博客:关于对13届蓝桥杯c语言c组的一些总结

前言

蓝桥杯已经过去一段时间了,经过几个月的努力也是拿到了省二,对于一个大一的萌新来说也是一个比较满意的成绩了。近几天在自学JAVA的时候看见狂神大大提的建议,于是也想自己来写一下。
image
也对前段时间的比赛进行一下总结。

题目

第一题

image
这题我是直接写了一段快排,也算是一到简单的签到题

#include <stdio.h>
#include <string.h>
void fun(char *s,int left,int right);
int main()
{
	char s[]="WHERETHEREISAWILLTHEREISAWAY";
	fun(s,0,strlen(s));
printf("%s",s);
	return 0;
}

void fun(char *s,int left,int right)
{
	if(left<right)
	{
		int i=left;
		int j=right-1;
		int t=s[i];
		while(i<j)
		{
			while(i<j&&t<s[j])
			{
				j--;
			}
			if(i<j)
			{
				s[i++]=s[j];
			}
			while(i<j&&t>s[i])
			{
				i++;
			}
			if(i<j)
			s[j--]=s[i];
		}
		s[i]=t;
		fun(s,left,i);
		fun(s,i+1,right);
	}
}

第二题

image
这题我没有做出来,刚开始是直接想用暴力算出来的,后来发现计算的时间太长了于是便改了一下代码由于时间原因没有仔细查错,草草便交了。
附上错误代码,有没有大佬可以指出一下错误。

#include <stdio.h>
int pd_year(int year,int *ans);
int pd_md(int *ans,int mon,int day);
int main()
{
	int num=0;
	int ans[2];
	int year,mon,day,t,m;
	int s[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
	for(year=1;year<=9999;year++)
	{
		if(pd_year(year,ans))
		{	
			if((year%4==0&&year%100!=0)||year&400==0)
			s[2]=29;
			else s[2]=28;
			for(mon=1;mon<=12;mon++)
			{
				for(day=1;day<=s[mon];day++)
				{
					if(pd_md(ans,mon,day))
					{
						for(t=1;t<=24;t++)
						{
							for(m=0;m<=59;m++)
							{
								if(pd_md(ans,t,m))
								{
									num++;
									printf("%04d %02d %02d %02d %02d\n",year,mon,day,t,m);
								}
							}
						}
					}
				}
			}
		}
	}
	printf("%d",num);
}

int pd_year(int year,int *ans)
{
	int flag[10]={0};
	int i;
	for(i=0;i<4;i++)
	{
		flag[year%10]++;
		year=year/10;
	}
	int a=0,b=0;
	for(i=0;i<10;i++)
	{
		if(flag[i]==3) {
			a=3,ans[0]=i;
		}
		if(flag[i==1]) {
			b=1;ans[1]=i;
		}
	}
	if(a==3&&b==1) return 1;
	else return 0;
}

int pd_md(int *ans,int mon,int day)
{
	int flag[10]={0};
	int i;
	for(i=0;i<2;i++)
	{
		flag[mon%10]++;
		mon=mon/10;
	}
	for(i=0;i<2;i++)
	{
		flag[day%10]++;
		day=day/10;
	}
	if(flag[ans[0]]==3&&flag[ans[1]]==1) return 1;
	else return 0;
}

第三题

image
这题也是一道签到题,没什么好说的,直接附上代码。

#include <stdio.h>
int main()
{
	char s[10];
	scanf("%s",s);
	int num[10][2]={{1189,841},{841,594},{594,420},{420,297},{297,210},{210,148},{148,105},{105,74},{74,52}};
	int a=s[1]-48;
	printf("%d\n",num[a][0]);
	printf("%d",num[a][1]);
	return 0;
}

第四题

image
第四题没什么思路,于是暴力一波骗分。希望有大佬提一下思路。

#include <stdio.h>
int main()
{	
	long n,i,j;
	long long sum=0;
	scanf("%ld",&n);
	long s[n];
	for(i=0;i<n;i++)
	{
		scanf("%ld",&s[i]);
		
	}
	for(i=0;i<n-1;i++)
	{
		for(j=i+1;j<n;j++)
		{
			sum=sum+(s[i]*s[j]);
		}
	}
	printf("%lld",sum);
	return 0;
}

第五题

image
这题我是运用了结构体和快排,大致思路是先将数据存在结构体数组里,然后先根据数的大小对结构体进行排序,然后对于排完序的结构体中数相同的区域根据数位进行排序。
代码如下

#include <stdio.h>

typedef struct demo{
	long num;
	long sum;
}demo; 
int fun1(long n);
void sqt1(demo *s,long left,long right);
void sqt2(demo *s,long left,long right);
int main()
{	
	long n,t,i,j;
	scanf("%ld",&n);
	scanf("%ld",&t);
	struct demo s[n];
	for(i=0;i<n;i++)
	{
		s[i].num=i+1;
		s[i].sum=fun1(i+1);
	}
	sqt1(s,0,n);
	for(i=0;i<n;)
	{
		int left=i;
		for(j=i;j<n;j++)
		{
			if(s[j].sum==s[j+1].sum)
			{
				continue;
			}
			else{
				sqt2(s,i,j+1);
				i=j+1;
			}
		}
	}
	printf("%ld",s[t-1].num);
	return 0;
}

int fun1(long n)
{
	long sum=0;
	while(n)
	{
		sum=sum+n%10;
		n=n/10;
	}
	return sum;
}

void sqt1(demo *s,long left,long right)
{
	if(left<right)
	{
		int i=left;
		int j=right-1;
		demo t=s[i];
		while(i<j)
		{
			while(i<j&&t.sum<s[j].sum)
			j--;
			if(i<j) s[i++]=s[j];
			while(i<j&&t.sum>s[i].sum)
			i++;
			if(i<j) s[j--]=s[i];
			
		}
		s[i]=t;
		sqt1(s,left,i);
		sqt1(s,i+1,right);
	}
}

void sqt2(demo *s,long left,long right)
{
	if(left<right)
	{
		int i=left;
		int j=right-1;
		demo t=s[i];
		while(i<j)
		{
			while(i<j&&t.num<s[j].num)
			j--;
			if(i<j) s[i++]=s[j];
			while(i<j&&t.num>s[i].num)
			i++;
			if(i<j) s[j--]=s[i];
			
		}
		s[i]=t;
		sqt2(s,left,i);
		sqt2(s,i+1,right);
	}
}

第六题

image
这题我也是暴力骗分。 =。=

#include <stdio.h>
int fun(long *s,long left,long right,long x);
int main()
{
	long n,m,x,i,j;
	scanf("%ld %ld %ld",&n,&m,&x);
	long s[n];
	for(i=0;i<n;i++)
	{
		scanf("%d",&s[i]);
	}
	int l,r;
	for(i=0;i<m;i++)
	{
		scanf("%d %d",&l,&r);
		if(fun(s,l,r,x)) printf("yes\n");
		else printf("no\n");
	}
	return 0;
	
}

int fun(long *s,long left,long right,long x)
{
	int i,j;
	for(i=left-1;i<right-1;i++)
	{
		for(j=i+1;j<right;j++)
		{
			
			if((s[i]^s[j])==x)
			{
				return 1;
			}
		}
	}
	return 0;
}

其他题目

后面一些题目大多是G了,也不会暴力去骗,所以就不放代码了。

第七题

image

第八题

image

第九题

image

第十题

image

总结

原本以为只可以混给省三都不一定可以,没想到竟然有省二,完全是意外之喜。也希望我能够在这条路可以一直走下去。

posted on 2022-05-07 20:57  阿金_阿金  阅读(239)  评论(0编辑  收藏  举报