C++练习2022年蓝桥杯第二次选拔赛
Posted ZSYL
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++练习2022年蓝桥杯第二次选拔赛相关的知识,希望对你有一定的参考价值。
【C++练习】蓝桥杯选拔赛
前言
写此篇仅为练习C++,刚好练练手,C++代码来源宋神sqr,研究大佬的C++代码,致谢!
A: 单调数列
题目描述
如果数组是单调递增或单调递减的,那么它是单调的。如果对于所有 i <= j,nums[i] <= nums[j],那么数组 nums 是单调递增的。 如果对于所有 i <= j,nums[i]> = nums[j],那么数组 nums 是单调递减的。当给定的数组 nums 是单调数组时输出"YES",否则输出"NO"。
输入
第一行输入一个正整数n表示数组大小(1<=n<=100000)
第二行输入n个[1,100000000]整数
输出
当给定的数组 nums 是单调数组时输出"YES",否则输出"NO"。
样例输入
4
4 3 2 1
样例输出
YES
题解:
- 简单题,数组读入之后,判断是否是顺序和逆序。
- 时间复杂度:O(n)
C++
#pragma Gcc optimize(3,"inline","Ofast");
#include<bits/stdc++.h>
using namespace std;
typedef unsigned long long ull;
#define int ull
int a[1000010];
signed main()
ios::sync_with_stdio(0);
int n;cin>>n;
for(int i = 1;i<=n;++i)
cin>>a[i];
bool rs = true;
for(int i = 2;i<=n;++i)
if(a[i] < a[i - 1])
rs = false;
if(rs) cout<<"YES";
else
bool rs = true;
for(int i = 2;i<=n;++i)
if(a[i] > a[i - 1])
rs = false;
if(rs) cout<<"YES";
else cout<<"NO";
Java
import java.util.Scanner;
public class Main
public static void main(String[] args)
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int flag = -1;
boolean f = true;
int pre = sc.nextInt();
while (n-- > 1)
int x = sc.nextInt();
if (flag == -1)
if (x < pre)
flag = 1; // jian
else
flag = 0; // zeng
else
if (flag == 1)
if (x > pre)
f = false;
break;
else
if (x < pre)
f = false;
break;
pre = x;
if (f)
System.out.println("YES");
else
System.out.println("NO");
B: 最大连续1的个数
题目描述
给定一个正整数n,请你计算n在二进制表示下最大连续1的个数。例如:正整数55的二进制表示为110111,则答案为3。
输入
输入一个正整数n(1<=n<=1e9)
输出
输出n在二进制表示下最大连续1的个数
样例输入
55
样例输出
3
题解:
- 读入之后,将数转为二进制,循环判断连续的1的个数,取最大值,别忘了在循环外面再去一次最大值
- 时间复杂度:O(log(n))
C++
#pragma Gcc optimize(3,"inline","Ofast");
#include<bits/stdc++.h>
using namespace std;
typedef unsigned long long ull;
#define int ull
signed main()
ios::sync_with_stdio(0);
int a;cin>>a;
int con = 0,mx = 0;
while(a)
if(a % 2 == 1)
con++;
mx = max(mx,con);
else con = 0;
a /= 2;
cout<<mx;
max(mx,con);
:判断最大值
Java
import java.util.Scanner;
public class Main
public static void main(String[] args)
Scanner sc = new Scanner(System.in);
long n = sc.nextInt();
int res = 0;
int max = 0;
while (n > 0)
if (n % 2 == 1)
res++;
else
res = 0;
max = Math.max(max, res);
n >>= 1;
System.out.println(max);
C: 祖玛游戏
题目描述
给你一个只含有小写字母的字符串s,请你从左至右在 s 中选择第一个 k 个相邻且相等的字母,并删除它们,使被删去的字符串的左侧和右侧连在一起。你需要对 s 重复进行无限次这样的删除操作,直到无法继续为止。在执行完所有删除操作后,输出最终得到的字符串。
输入
整数k和字符串s,(2<=k<=5,1<=|s|<=1000000)
输出
输出执行完所有删除操作后最终得到的字符串。
样例输入
3
deeedbbcccbdaa
样例输出
aa
题解:
- 利用栈压入字符串,若栈顶的k个元素相同,则将这k个元素弹出。可以采用数组模拟栈,然后直接操作栈里面的元素。
- 时间复杂度:O(log(n))
#pragma Gcc optimize(3,"inline","Ofast");
#include<bits/stdc++.h>
using namespace std;
typedef unsigned long long ull;
#define int ull
char st[10000100];
int top = 0,k = 0;
void add_st(char x)
st[++top] = x;
bool checked()
if(top < k) return false;
for(int j = 1;j<k;++j)
if(st[top] != st[top - j])
return false;
return true;
signed main()
ios::sync_with_stdio(0);
string s;
cin>>k>>s;
for(char c:s)
add_st(c);
if(checked())
top -= k;
for (int i = 1;i<=top;++i)
cout<<st[i];
值得学习!
Java
import java.util.ArrayList;
import java.util.HashSet;
import java.util.Scanner;
import java.util.Set;
public class Main
public static void main(String[] args)
Scanner sc = new Scanner(System.in);
int k = sc.nextInt();
String s = sc.next();
Set<Character> set = new HashSet();
for (char c : s.toCharArray())
set.add(c);
ArrayList<String> arr = new ArrayList<>();
for (char c : set)
String x = "";
for (int i = 0; i < k; i++)
x+=c;
arr.add(x);
boolean flag = true;
while (true)
flag = false;
for (String ss: arr)
if (s.contains(ss))
s = s.replace(ss, "");
flag = true;
if (!flag)
break;
System.out.println(s);
D: 因数
题目描述
给定正整数n,n只能被素因子2、3、5整除,请你求出正整数n能被2整除的因数个数。例如:n=6,6的因数为:1、2、3、6。答案为2。
输入
正整数n(1<=n<=1e16)
输出
求出正整数n能被2整除的因数个数
样例输入
6
样例输出
2
题解:
- 因为n只是由素因子2、3、5组成,即 n = 2 a ∗ 3 b ∗ 5 c n=2^a* 3^b∗5^c n=2a∗3b∗5c,求出a、b、c。题中问的是n的因数中能被2整除的个数,所以答案为a*(b+1)*(c+1)
- 时间复杂度:O(log(n))
Python
n = eval(input())
b = n
m = 2:0,3:0,5:0
while n != 1:
if n % 2 == 0:
m[2] += 1
n //= 2
if n % 3 == 0:
m[3] += 1
n //= 3
if n % 5 == 0:
m[5] += 1
n //= 5
print((m[2]) * (m[3] + 1) * (m[5] + 1))
统计次数!
E: 计算24
题目描述
游戏规则是:对4个 1∼10 之间的正整数,进行加、减、乘三种运算,要求运算结果等于二十四。乘法的优先级高于加、减,并且算式中不可以用括号,不可以改变4个数字出现的顺序。例如:若给出的 44个操作数是:10、2、4、8,则有2种可能的解答方案:10+2+4+8=24,10*2-4+8=24。现在给你4个1∼10 之间的正整数,请你计算解答方案数。
输入
4个 1∼10 之间的正整数
输出
输出方案总数
样例输入
10 2 4 8
样例输出
2
题解:
- 1、列举27种可能的计算表达式
2、DFS加表达式求值
使用深度优先搜索跑出所有的表达式,然后利用栈来处理表达式,计算答案。
Python
s = input().split(" ")
s = list(s)
st = '+','-','*'
rs = 0
for a in st:
for b in st:
for c in st:
if eval(s[0] + a + s[1] + b + s[2] + c + s[3]) == 24:
rs += 1
print(rs)
Java
import java.util.Scanner;
public class Main
static int max = 0;
static int[] x;
public static void main(String[] args)
Scanner sc = new Scanner(System.in);
x = new int[4];
for (int i = 0; i < 4; i++)
x[i] = sc.nextInt();
dfs(0, "");
System.out.println(max);
public static void dfs(int i, String cur)
if (i == 3)
int res = 0;
if (!cur.contains("*"))
res = x[0];
for (int j = 0; j < 3; j++)
if (cur.charAt(j) == '+')
res += x[j+1];
else
res -= x[j+1];
else
if (cur.charAt(0) == '*' && cur.charAt(2) == '*' && cur.charAt(1) == '*')
res = x[0]*x[1]*x[2]*x[3];
else if (cur.charAt(0) == '*' && cur.charAt(1) == '*')
res = x[0]*x[1]*x[2];
if (cur.charAt(2) == '+')
res += x[3];
else
res -= x[3];
else if (cur.charAt以上是关于C++练习2022年蓝桥杯第二次选拔赛的主要内容,如果未能解决你的问题,请参考以下文章
2021年软件类第十二届蓝桥杯第二场省赛 python组 F-J题解