zl程序教程

您现在的位置是:首页 >  后端

当前栏目

蓝桥杯冲刺(C/C++)(二) 真题练习(持续更新...积极备赛)

C++ 更新 蓝桥 练习 ... 持续 真题 冲刺
2023-09-11 14:19:30 时间

人要么就是好看,要么就是丑陋,

中间不美不丑的,只能说可爱。



目录

人要么就是好看,要么就是丑陋,

中间不美不丑的,只能说可爱。

蓝桥杯2022年第十三届省赛真题-纸张尺寸🏔

题目描述

输入格式

输出格式

样例输入

样例输出

蓝桥杯2022年第十三届省赛真题-求和🏔

题目描述

输入格式

输出格式

样例输入

样例输出

提示

蓝桥杯2022年第十三届省赛真题-数位排序🏔

题目描述

输入格式

输出格式

样例输入

样例输出

提示

蓝桥杯2022年第十三届省赛真题-选数异或🏔

题目描述

输入格式

输出格式

样例输入

样例输出

提示

获取源码?私信?关注?点赞?收藏?



蓝桥杯2022年第十三届省赛真题-纸张尺寸🏔

时间限制: 1s 内存限制: 512MB 提交: 1977 解决: 1479

题目描述

在 ISO 国际标准中定义了 A0 纸张的大小为 1189mm × 841mm,将 A0 纸沿长边对折后为 A1 纸,大小为 841mm × 594mm,在对折的过程中长度直接取下整(实际裁剪时可能有损耗)。将 A1 纸沿长边对折后为 A2 纸,依此类推。 

输入纸张的名称,请输出纸张的大小。 

输入格式

输入一行包含一个字符串表示纸张的名称,该名称一定是 A0、A1、A2、A3、A4、A5、A6、A7、A8、A9 之一。 

输出格式

输出两行,每行包含一个整数,依次表示长边和短边的长度。

样例输入

A0

样例输出

1189
841
#include<iostream>
#include<algorithm>
int l=1189,w=841; // 原尺寸
using namespace std;
bool max(int x,int y){ // 递归调用
	if(x>y){ // 比较
		return l=x,w=y; // 长=l 宽=w 
//因为每次需要折叠长的一边
	}
	else{
		return l=y,w=x;
	}
}
int main(){
	char a;
	int n;
	cin >> a >> n;
	for(int i=0;i<=n;i++){
		if(i==n){
			cout << l << endl << w; // A0时
		}
		else{
			l=l/2; // 折叠
			max(l,w);
		}
	}
} 

笔记:

        使用了递归函数  返回值
        min(x,y)函数
        针对向下取整问题只需直接除即可 

/*!!!

由于作者才疏学浅,代码无论从时间复杂度、效率、方法等方面无疑不是最优解,疏漏之处在所难免,还希望广大读者指正

!!!*/


蓝桥杯2022年第十三届省赛真题-求和🏔

时间限制: 1s 内存限制: 256MB 提交: 5085 解决: 1937

题目描述

给定 n 个整数 a1, a2, · · · , an ,求它们两两相乘再相加的和,即 S = a1 · a2 + a1 · a3 + · · · + a1 · an + a2 · a3 + · · · + an-2 · an-1 + an-2 · an + an-1 · an.

输入格式

输入的第一行包含一个整数 n 。 

第二行包含 n 个整数 a1, a2, · · · an。

输出格式

输出一个整数 S,表示所求的和。请使用合适的数据类型进行运算。

样例输入

4
1 3 6 9

样例输出

117

提示

对于 30% 的数据,1 ≤ n ≤ 1000,1 ≤ ai ≤ 100。

对于所有评测用例,1 ≤ n ≤ 200000,1 ≤ ai ≤ 1000。

#include<iostream>
#include<algorithm>
#include<cstdio>
long long int sArray[200005],nArray[200005],sum=0;
long long a[200005];
long long b[200005];
using namespace std;
int main(){
/*
第一次写题:
	long long int sum=0;
	int nArray[200005]={0},n; // 定义数组
	scanf("%d",&n); // 给定整数n 输入
	for(int i=0;i<n;i++){
		scanf("%d",&nArray[i]); // 循环输入a1,a2……
	}
	for(int j=0;j<n-1;j++){
		for(int k=j+1;k<n;k++){
			sum=sum+nArray[j]*nArray[k]; //两两相加再相乘的和
 		}
	}
	printf("%lld",sum);
	return 0;
时间超限
*/
//优化之后:
    int n;
    cin>>n;
    for (int i = 1; i <= n; ++i) {
        cin>>b[i];
        a[i]=a[i-1]+b[i]; // 预处理,前缀
    }
    long long sum=0;
    for(int i=1;i<=n;i++){
        sum+=b[i]*(a[n]-a[i]); // 求和
    }
    cout<<sum;
}

 笔记:

        不难看出第一次我的想法还是比较直接的---就是两两相加再相乘,但是由于时间超限就不得不再次优化
        预处理,前缀
        找寻优化思路,方法!!!

/*!!!

由于作者才疏学浅,代码无论从时间复杂度、效率、方法等方面无疑不是最优解,疏漏之处在所难免,还希望广大读者指正

!!!*/


蓝桥杯2022年第十三届省赛真题-数位排序🏔

时间限制: 1s 内存限制: 512MB 提交: 1756 解决: 841

题目描述

小蓝对一个数的数位之和很感兴趣,今天他要按照数位之和给数排序。当两个数各个数位之和不同时,将数位和较小的排在前面,当数位之和相等时,将数值小的排在前面。

例如,2022 排在 409 前面,因为 2022 的数位之和是 6,小于 409 的数位之和 13。

又如,6 排在 2022 前面,因为它们的数位之和相同,而 6 小于 2022。

给定正整数 n,m,请问对 1 到 n 采用这种方法排序时,排在第 m 个的元素是多少? 

输入格式

输入第一行包含一个正整数 n。

第二行包含一个正整数 m。

输出格式

输出一行包含一个整数,表示答案。

样例输入

13
5

样例输出

3

提示

1 到 13 的排序为:1, 10, 2, 11, 3, 12, 4, 13, 5, 6, 7, 8, 9。第 5 个数为 3。

对于 30% 的评测用例,1 ≤ m ≤ n ≤ 300。

对于 50% 的评测用例,1 ≤ m ≤ n ≤ 1000。

对于所有评测用例,1 ≤ m ≤ n ≤ 106。 

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
long long int n,m,nArray[1000005],sArray[1000005],sum=0; // 数组较大 
bool cmp(int x,int y){ // 注意递归调用
	return (sArray[x]<sArray[y])||(sArray[x]==sArray[y]&&x<y) ; // 关键点  排序
}
int main(){
	scanf("%d\n%d",&n,&m);
	for(int i=1;i<=n;i++){
		nArray[i]=i;
		int temp=i;
		while(temp){
			sArray[i]=sArray[i]+(temp%10); // 求数位之和 个十百千  除余运算
			temp=temp/10;
		}
	}
	sort(nArray+1,nArray+n+1,cmp); // 自定义排序
	printf("%d\n",nArray[m]);
	return 0;
}

 笔记:

        本题关键点在于,判断数位之和相同之后,如何再根据整数大小排序

        递归调用

        sort(x,y)

/*!!!

由于作者才疏学浅,代码无论从时间复杂度、效率、方法等方面无疑不是最优解,疏漏之处在所难免,还希望广大读者指正

!!!*/


蓝桥杯2022年第十三届省赛真题-选数异或🏔

时间限制: 1s 内存限制: 256MB 提交: 2639 解决: 722

题目描述

给定一个长度为 n 的数列 A1, A2, · · · , An 和一个非负整数 x,给定 m 次查询, 每次询问能否从某个区间 [l,r] 中选择两个数使得他们的异或等于 x 。

输入格式

输入的第一行包含三个整数 n, m, x 。

第二行包含 n 个整数 A1, A2, · · · , An 。

接下来 m 行,每行包含两个整数 li ,ri 表示询问区间 [li ,ri ] 。

输出格式

对于每个询问, 如果该区间内存在两个数的异或为 x 则输出 yes, 否则输出 no。

样例输入

4 4 1
1 2 3 4
1 4
1 2
2 3
3 3

样例输出

yes
no
yes
no

提示

显然整个数列中只有 2, 3 的异或为 1。

对于 20% 的评测用例,1 ≤ n, m ≤ 100;

对于 40% 的评测用例,1 ≤ n, m ≤ 1000;

对于所有评测用例,1 ≤ n, m ≤ 100000 ,0 ≤ x < 220 ,1 ≤ li ≤ ri ≤ n , 0 ≤ Ai < 220。 

#include<iostream>
#include<cstdio>
#include<algorithm>
#define ll long long // long long 推荐在大于10^5  均使用  long long int
using namespace std;
int f[100005],pos[5000005]; // \0
int main(){
    int n,m,x;
    cin>>n>>m>>x;
    for(int i=1;i<=n;++i){
        int a;
        scanf("%d",&a);
        f[i]=max(f[i-1],pos[a^x]); // 输入A1,A2…… 两数中最大值 异或 预处理
        pos[a]=i;
    }
    while(m--){
        int l,r;
        scanf("%d%d",&l,&r);
        if(f[r]>=l){ // 由于已经进行预处理 即可直接判断  大于等于左即可
            printf("yes\n");
        }
        else{
            printf("no\n");
        }
    }
}

   笔记:      

        异或,十进制转二进制,二进制比较相等为0,不相等为1
        (a^b)  异或
        动态规划(DP算法),时间超限,max(x,y)函数   {预处理}
        /*
        首先,我们容易知道:若a^b=x,那么a^x=b,对于数组a[i],
        我们可以通过关系式,找到a[i]^x的左边的最靠近下标,明显我们需要找到最靠近的下标,
        而当这个下标是大于等于所需要找的区间的左端点,
        即可满足这个区间内可以找到两个数的异或为x。
        当对于一个数,其左边没有数与其异或等于x时,那么就将其置为0,
        而当我们不断输入数字的时候,我们需要同时存储这个数的下标,
        方便循环到下一个下标的时候找到这个数字(通过a^x=b这样的关系)
        */

/*!!!

由于作者才疏学浅,代码无论从时间复杂度、效率、方法等方面无疑不是最优解,疏漏之处在所难免,还希望广大读者指正

!!!*/


 好了,这篇文章到这就结束了,就是一个简简单单的题解,希望可以帮助到大家!!!

蓝桥杯冲刺!!!加油!!!

后续会继续更新,真题+基础题 

只为拿奖

兄弟们冲啊!!!


2023年第三十期,希望得到大家的喜欢🙇‍

也是新的系列,将会持续更新,🙇‍

希望大家有好的意见或者建议,欢迎私信


以上就是本篇文章的全部内容了

 ~ 关注我,点赞博文~ 每天带你涨知识!

1.看到这里了就 [点赞+好评+收藏] 三连 支持下吧,你的「点赞,好评,收藏」是我创作的动力。

2.关注我 ~ 每天带你学习 :各种前端插件、3D炫酷效果、图片展示、文字效果、以及整站模板 、HTML模板 、C++、数据结构、Python程序设计、Java程序设计、爬虫等! 「在这里有好多 开发者,一起探讨 前端 开发 知识,互相学习」!

3.以上内容技术相关问题可以相互学习,可 关 注 ↓公 Z 号 获取更多源码 !
 

获取源码?私信?关注?点赞?收藏?

👍+✏️+⭐️+🙇‍

有需要源码的小伙伴可以 关注下方微信公众号 " Enovo开发工厂 "🙇‍