第十二届蓝桥杯校内模拟赛记录12月26日

前言

部分题目无法通过全部测试样例,待优化。

第1题

问题描述
  如果整数 a 是整数 b 的整数倍,则称 b 是 a 的约数。
  请问,有多少个正整数是 2020 的约数。
答案提交
这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。

答案:12

代码:

#include <stdio.h>

int main(){
	int i;
	int num = 2020;
	int cnt = 0;
	for(i=1;i<=num;i++){
		if(num%i == 0){
			cnt++;
		}
	}
	printf("%d",cnt);
	return 0;
}

第2题

问题描述
  如果一个 mp3 文件占用磁盘的大小是 4MB,小蓝的硬盘还剩下 100GB 的空间,请问他还可以放多少个这样的 mp3 文件?
答案提交
这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。

答案:25600

代码:

#include <stdio.h>

int main(){
	int yp = 100*1024;
	int ans = yp/4;
	printf("%d",ans);
	return 0;
}

第3题

问题描述
  一个包含 2020 个结点的无向图,如果图中没有自环和重边,最多包含多少条边?
答案提交
  这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。

答案:2039190

代码:

#include <stdio.h>

int main(){
	int jd;
	int bian;
	int anum;
	bian = 0;
	anum = 1;
	
	for(jd = 2; jd<=2020; jd++){
		bian += anum;
		anum++;
		printf("jd = %d , bian = %d\n",jd,bian);
	}
	return 0;
}

第4题

问题描述
  整数 1 到 6 连在一起,成为 123456,长度为 6。
  整数 1 到 12 连在一起,成为 123456789101112,长度为 15。
  请问整数 1 到 2020 连在一起,长度为多少?
答案提交
  这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。

答案:6973

代码:

#include <stdio.h>

int main(){
	int ord = 2020;
	int i;
	int num;
	int cnt;
	int all_cnt = 0;
	for(i=1; i<=ord; i++){
		//记录该数字的位数
		//默认位数为1 
		cnt = 1;
		num = i;
		//每次除以10≠0,则cnt++ 
		while((num/10)!= 0){
			cnt++;
			num/=10;
		}
		//cnt为当前数的位数
		 all_cnt += cnt;
	}
	printf("%d",all_cnt);
	return 0;
}

第5题

问题描述
  在一个序列 a = (a[1], a[2], …, a[n]) 中,如果 (i, j) 满足 i < j 且 a[i] > a[j],则称为一个逆序对。
  例如:(3, 2, 2, 1) 中包含 6 个逆序对。
  请问,(87, 39, 35, 1, 99, 10, 54, 1, 46, 24, 74, 62, 49, 13, 2, 80, 24, 58, 8, 14, 83, 23, 97, 85, 3, 2, 86, 10, 71, 15) 中包含多少个逆序对?
答案提交
  这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。

答案:221或217

代码:

/*
思路:双指针 
*/

#include <stdio.h>

int main(){
	int a[]={
		87, 39, 35, 1, 99, 10, 54, 1, 46, 24, 74, 62, 49, 13, 2, 80, 24, 58, 8, 14, 83, 23, 97, 85, 3, 2, 86, 10, 71, 15,
	};
	int n = 30;
	int i,j;
	int cnt = 0;
	
	for(i=0;i<n-1;i++){
		for(j=i+1;j<n;j++){
			if(a[i]>a[j]){
				cnt++;
			}
		}
	}
	printf("%d",cnt);
	
	return 0;
}

第6题

问题描述
  给定一个三角形的底边长度 l 和高度 h,求三角形的面积。
输入格式
  输入的第一行包含一个整数 l,表示三角形的底边长度。
  第二行包含一个整数 h,表示三角形的高。
输出格式
  输出一个数,表示三角形的面积。如果面积为整数,请直接输出这个整数,不带小数点。如果面积不是整数,请四舍五入保留正好一位小数。
样例输入
5
6
样例输出
15
样例输入
5
3
样例输出
7.5
数据规模和约定
  对于所有评测用例,1 <= l, h <= 100。

代码:

#include <stdio.h>

int main(){
	int l,h,temp;
	int ians;
	double dans;
	
	scanf("%d",&l);
	scanf("%d",&h);
	temp = l*h;
	
	if(temp%2==0){
		ians = temp/2;
		printf("%d",ians);
	}else{
		dans = (double)temp/2.0;
		printf("%.1lf",dans);
	}
	
	return 0;
}

第7题

问题描述
  小蓝正在上小学,老师要求同学们在暑假每天记日记。可是小蓝整个暑假都在玩,直到最后一天才想起要记日记。于是小蓝赶紧编了一些日记交给老师。
  没想到,日记很快就被老师发现了问题,原来小蓝记完8月31日的日记,竟又记了8月32日和8月33日的日记。这显然是有问题的,因为根本没有8月32日和8月33日。
  给定一个月份和一个日期,请问2021年有没有这一天。
输入格式
  输入的第一行包含一个整数 m,表示月份。
  第二行包含一个整数 d,表示日期。
输出格式
  如果2021年有 m 月 d 日,输入 yes,否则输出 no。
样例输入
8
32
样例输出
no
样例输入
2
28
样例输出
yes
数据规模和约定
  对于所有评测用例,1 <= m <= 20,1 <= d <= 40。

代码:

#include <stdio.h>

//2021年不是闰年,2月有28天
const int table[13]={
	0,31,28,31,30,31,30,31,31,30,31,30,31,
};

int main(){
	int m,d;//月份和日期
	int ans;//yes为1,no为0
	scanf("%d",&m); 
	scanf("%d",&d);
	
	if(d<1)ans = 0;
	else if(d>table[m])ans = 0;
	else ans = 1;
	
	if(ans){
		printf("yes");
	}else{
		printf("no");
	}
	
	return 0;
}

第8题

问题描述
  给定一个单词,请问在单词中删除 t 个字母后,能得到的字典序最小的单词是什么?
输入格式
  输入的第一行包含一个单词,由大写英文字母组成。
  第二行包含一个正整数 t。
输出格式
  输出一个单词,表示答案
样例输入
LANQIAO
3
样例输出
AIAO
数据规模和约定
  对于所有评测用例,单词长度不超过 100,t 小于单词长度。

代码:

/*
字典序最小单词
遍历所有的可能,找到字典序最小的。 
*/

#include <stdio.h>
#include <string.h>

char a[101];
int book[101];
char jg[101];
char b[101];

void fuzhi(char aa[],char bb[]){
	int i;
	for(i=0;bb[i];i++){
		aa[i] = bb[i];
	}
	aa[i] = 0;
}

int bijiao(char aa[],char bb[]){
	int i;
	for(i=0;aa[i]!=0 && bb[i]!=0;i++){
		if(aa[i]!=bb[i])return aa[i]-bb[i];
	}
}

void dfs(int len,int t,int step){
	//已经填了t个了,使用strcmp比较 
	int i,j;
	int temp;
	if(step==t){
		j=0;
		for(i=0;i<len;i++){
			if(a[i]!=-1){
				b[j] = a[i];
				j++;
			}
		}
		b[j] = 0;
		//如果这个b比jg小,那么它成为新的结果 
		if(bijiao(b,jg)<0){
			fuzhi(jg,b);
		}
		return;
	}
	for(i=0;i<len;i++){
		if(book[i] == 0){
			temp = a[i];
			a[i] = -1;
			book[i] = 1;
			dfs(len,t,step+1);
			book[i] = 0;
			a[i] = temp;
		}
	}
}

int main(){
	char arr[101];
	int t,i,len,maxi,j;
	scanf("%s",arr);
	scanf("%d",&t);
	len = strlen(arr);
	
	fuzhi(a,arr);
	
	for(i=0;i<len;i++){
		jg[i] = 127;
	}
	jg[i] = 0;
	
	dfs(len,t,0);
	printf("%s",jg);
	return 0;
}

第9题

问题描述
  给定一个序列 a_1, a_2, …, a_n。其中 a_1 < a_2 < … < a_n。
  相邻两个数之间的差(后一个数减前一个数)称为它们的间隙。
  请问序列中最大的间隙值是多少?
输入格式
  输入的第一行包含一个整数 n,表示序列的长度。
  第二行包含 n 个正整数,为给定的序列。
输出格式
  输出一个整数,表示序列中最大的间隙值。
样例输入
5
1 3 8 9 12
样例输出
5
样例说明
  a_3 - a_2 = 5。
数据规模和约定
  对于所有评测用例,1 <= n <= 1000,1 <= a_i <= 100000。

代码:

#include <stdio.h>

int main(){
	int arr[1001];
	int n,i;
	int jx,max; 
	
	scanf("%d",&n);
	for(i=0;i<n;i++)scanf("%d",&arr[i]);
	
	//遍历每个序列的间隙,得到最大值
	max = 0;
	for(i=1;i<n;i++){
		jx = arr[i] - arr[i-1];
		if(jx>max){
			max = jx;
		}
	}
	printf("%d",max);
	
	return 0;
}

第10题

问题描述
  小蓝有黄绿蓝三种颜色的小球,分别为 R, G, B 个。同样颜色的小球没有区别。
  小蓝将这些小球从左到右排成一排,排完后,将最左边的连续同色小球个数记为 t_1,将接下来的连续小球个数记为 t_2,以此类推直到最右边的小球。
  请问,总共有多少总摆放小球的方案,使得 t_1, t_2, … 为严格单调递增序列,即 t_1 < t_2 < t_3 < …
输入格式
  输入一行包含三个整数 R, G, B。
输出格式
  输出一个整数,表示答案。
样例输入
3 6 0
样例输出
3
样例说明
  用 r 表示红球,g 表示绿球,可能的方案包括:
  rrrgggggg
  grrrggggg
  ggrrrgggg
样例输入
2 4 6
样例输出
3
样例说明
  用 r 表示红球,g 表示绿球,b 表示蓝球,可能的方案包括:
  rrggggbbbbbb
  grrgggbbbbbb
  brrggggbbbbb
数据规模和约定
对于30%的评测用例,1 <= R, G, B <= 10;
  对于60%的评测用例,1 <= R, G, B <= 30;
  对于所有评测用例,1 <= R, G, B <= 50。

调试代码:

/*
遍历出全排列,找出严格增序的
给个数据序列,返回序列的连续数据 
*/

#include <stdio.h>

char a[151];
int lxa[100];
int ans; 

int zhaolx(){
	int i,j;
	int cnt;
	
	cnt = 1;
	j = 0;
	for(i=0;a[i];i++){
		if(a[i]==a[i+1]){
			cnt++;
		}else{
			lxa[j] = cnt;
			j++;
			cnt = 1;
		}
	}
	return j;
}

int isZenxu(int len){
	int i;
	for(i=1;i<len;i++){
		if(lxa[i]<=lxa[i-1]){
			return 0;
		}
	}
	return 1;
}

void dfs(int step,int rn,int gn,int bn){
	int lx_len;
	int j;
	if(rn==0&&gn==0&&bn==0){
		a[step]=0;
		
		
		lx_len = zhaolx();
		
		if(isZenxu(lx_len)){
			ans++;
			
			printf("%s\n",a);
			for(j=0;j<lx_len;j++)printf("%d ",lxa[j]);
			printf("\n");
		}
		return;
	}
	
	if(rn!=0){
		a[step]='R';
		dfs(step+1,rn-1,gn,bn);
	}
	if(gn!=0){
		a[step]='G';
		dfs(step+1,rn,gn-1,bn);
	}
	if(bn!=0){
		a[step]='B';
		dfs(step+1,rn,gn,bn-1);
	}
}

int main(){
	int rn,gn,bn;
	int i;
	scanf("%d%d%d",&rn,&gn,&bn);
	ans = 0;
	dfs(0,rn,gn,bn);
	printf("%d",ans);
	return 0;
}

提交代码:

/*
遍历出全排列,找出严格增序的
给个数据序列,返回序列的连续数据 
*/

#include <stdio.h>

char a[151];
int lxa[100];
int ans; 

int zhaolx(){
	int i,j;
	int cnt;
	
	cnt = 1;
	j = 0;
	for(i=0;a[i];i++){
		if(a[i]==a[i+1]){
			cnt++;
		}else{
			lxa[j] = cnt;
			j++;
			cnt = 1;
		}
	}
	return j;
}

int isZenxu(int len){
	int i;
	for(i=1;i<len;i++){
		if(lxa[i]<=lxa[i-1]){
			return 0;
		}
	}
	return 1;
}

void dfs(int step,int rn,int gn,int bn){
	int lx_len;
	int j;
	if(rn==0&&gn==0&&bn==0){
		a[step]=0;
		
		lx_len = zhaolx();
		
		if(isZenxu(lx_len)){
			ans++;
		}
		return;
	}
	
	if(rn!=0){
		a[step]='R';
		dfs(step+1,rn-1,gn,bn);
	}
	if(gn!=0){
		a[step]='G';
		dfs(step+1,rn,gn-1,bn);
	}
	if(bn!=0){
		a[step]='B';
		dfs(step+1,rn,gn,bn-1);
	}
}

int main(){
	int rn,gn,bn;
	int i;
	scanf("%d%d%d",&rn,&gn,&bn);
	ans = 0;
	dfs(0,rn,gn,bn);
	printf("%d",ans);
	return 0;
}
评论 17
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值