蓝桥杯c++刷题记录

[蓝桥杯 2013 省 AB] 错误票据

题目背景

某涉密单位下发了某种票据,并要在年终全部收回。

题目描述

每张票据有唯一的 ID 号,全年所有票据的 ID 号是连续的,但 ID 的开始数码是随机选定的。因为工作人员疏忽,在录入 ID 号的时候发生了一处错误,造成了某个 ID 断号,另外一个 ID 重号。

你的任务是通过编程,找出断号的 ID 和重号的 ID。

数据保证断号不可能发生在最大和最小号。

输入格式

一个整数 N ( N < 100 ) N(N<100) N(N<100) 表示后面数据行数,接着读入 N N N 行数据,每行数据长度不等,是用空格分开的若干个(不大于 100 100 100 个)正整数(不大于 1 0 5 10^5 105),每个整数代表一个 ID 号。

输出格式

要求程序首先输入要求程序输出 1 1 1 行,含两个整数 m m m n n n,用空格分隔,其中, m m m 表示断号 ID, n n n 表示重号 ID。

样例 #1

样例输入 #1

2
5 6 8 11 9
10 12 9

样例输出 #1

7 9

样例 #2

样例输入 #2

6
164 178 108 109 180 155 141 159 104 182 179 118 137 184 115 124 125 129 168 196
172 189 127 107 112 192 103 131 133 169 158
128 102 110 148 139 157 140 195 197
185 152 135 106 123 173 122 136 174 191 145 116 151 143 175 120 161 134 162 190
149 138 142 146 199 126 165 156 153 193 144 166 170 121 171 132 101 194 187 188
113 130 176 154 177 120 117 150 114 183 186 181 100 163 160 167 147 198 111 119

样例输出 #2

105 120

题解

#include<iostream>
using namespace std;
int main(){
	int n,miss,fix,num[10000]={0};
	cin>>n;
	for(int j=1;j<=n;j++){
		int id;
		while(cin>>id){
			num[id]++;
			if(num[id]>1) fix=id;
			if(cin.get()=='\n') break;
		}
	}
	for(int j=1;j<10000;j++){
		if(num[j-1]==1&&num[j]==0){
			miss=j;
			break;
		}
	}
	cout<<miss<<' '<<fix<<endl;
	return 0;
}

cin.get() 是 C++ 中的一个成员函数,用于从输入流(istream)中获取一个字符。它以不同的形式提供了几种用法:

cin.get():
从输入流中获取下一个字符,并将其作为整数返回。这可以用于读取单个字符。

char ch = cin.get();  // 读取下一个字符,并将其赋值给变量 ch

cin.get(char& ch):
从输入流中获取下一个字符,并将其赋值给指定的字符变量。

char ch;
cin.get(ch);  // 读取下一个字符,并将其赋值给变量 ch

cin.get(char* str, streamsize n):
从输入流中获取字符序列,直到遇到换行符(‘\n’)或读取了 n-1 个字符(包括空格和标点符号),并将它们存储在指定的字符数组 str 中。

char str[100];
cin.get(str, 100);  // 从输入流中读取字符序列,存储在 str 数组中

cin.get() 函数可以用于读取字符或字符序列,依赖于它的不同形式和参数。它是对标准输入流进行字符级别读取的一种方式。

[蓝桥杯 2022 省 B] 刷题统计

题目描述

小明决定从下周一开始努力刷题准备蓝桥杯竞赛。他计划周一至周五每天做 a a a 道题目,周六和周日每天做 b b b 道题目。请你帮小明计算,按照计划他将在第几天实现做题数大于等于 n n n 题?

输入格式

输入一行包含三个整数 a , b a, b a,b n n n.

输出格式

输出一个整数代表天数。

样例 #1

样例输入 #1

10 20 99

样例输出 #1

8

提示

对于 50 % 50 \% 50% 的评测用例, 1 ≤ a , b , n ≤ 1 0 6 1 \leq a, b, n \leq 10^{6} 1a,b,n106.

对于 100 % 100 \% 100% 的评测用例, 1 ≤ a , b , n ≤ 1 0 18 1 \leq a, b, n \leq 10^{18} 1a,b,n1018.

蓝桥杯 2022 省赛 B 组 C 题。

#include<iostream>
using namespace std;
int main() {
	long int a,b,n,sum = 0,cnt;
	
	cin >> a >> b >> n;
	for(cnt=1; sum<=n; cnt++) {
		if(cnt%7<=5&&cnt%7>=1) sum+=a;//周一到周五,逐日枚举,注意周日模7等于零 
		else sum+=b;
	}
	cnt--;
	cout<<cnt;

	return 0;
	//in与long int的使用区别??
}

[蓝桥杯 2020 省 AB1] 解码

题目描述

小明有一串很长的英文字母,可能包含大写和小写。

在这串字母中,有很多连续的是重复的。小明想了一个办法将这串字母表达得更短:将连续的几个相同字母写成字母 + 出现次数的形式。 例如,连续的 5 5 5a,即 aaaaa,小明可以简写成 a5(也可能简写成 a4aaa3a 等)。

对于这个例子:HHHellllloo,小明可以简写成 H3el5o2。为了方便表达,小明不会将连续的超过9个相同的字符写成简写的形式。

现在给出简写后的字符串,请帮助小明还原成原来的串。

输入格式

输入一行包含一个字符串。

输出格式

输出一个字符串,表示还原后的串。

样例 #1

样例输入 #1

H3el5o2

样例输出 #1

HHHellllloo

提示

对于所有评测用例,字符串由大小写英文字母和数字组成,长度不超过 100 100 100。请注意原来的串长度可能超过 100 100 100

//string表述字符串,直接输入
//注意等于9
#include<iostream>
using namespace std;
int main(){
	string s;
	cin>>s;
	for(int i=0;i<s.size();i++){
		if(s[i]>'0'&&s[i]<='9'){//注意等于9 
			for(int j=1;j<=s[i]-'0';j++){
				cout<<s[i-1];
			}
		}else{
			if(s[i+1]>'0'&&s[i+1]<='9') continue;//注意等于9 
			else cout<<s[i];
		}
	} 
	return 0;
}

c++中的整数类型

short:通常占用 2 个字节,取值范围约为 -32,768 到 32,767。

int:通常占用 4 个字节,取值范围约为 -2,147,483,648 到 2,147,483,647。
(满足109

long:通常占用 4 个字节或 8 个字节(取决于操作系统),取值范围和 int 类似,但可能更大。

long long:通常占用 8 个字节,取值范围约为 -9,223,372,036,854,775,808 到
9,223,372,036,854,775,807。这个类型是 C++11 标准引入的。
(满足1018

无符号整数类型,没有负数取值范围,能表示更大的正数:

unsigned short:通常占用 2 个字节,取值范围约为 0 到 65,535。

unsigned int:通常占用 4 个字节,取值范围约为 0 到 4,294,967,295。

unsigned long:通常占用 4 个字节或 8 个字节(取决于操作系统),取值范围通常比 unsigned int 更大。

unsigned long long:通常占用 8 个字节,取值范围约为 0 到 18,446,744,073,709,551,615。

[蓝桥杯 2020 省 AB3] 日期识别

dev设置stoi函数
在这里插入图片描述

题目描述

小蓝要处理非常多的数据, 其中有一些数据是日期。

在小蓝处理的日期中有两种常用的形式:英文形式和数字形式。

英文形式采用每个月的英文的前三个字母作为月份标识,后面跟两位数字表示日期,月份标识第一个字母大写,后两个字母小写, 日期小于 10 10 10 时要补前导 0 0 0 1 1 1 月到 12 12 12 月英文的前三个字母分别是 JanFebMarAprMayJunJulAugSepOctNovDec

数字形式直接用两个整数表达,中间用一个空格分隔,两个整数都不写前 导 0。其中月份用 1 1 1 12 12 12 分别表示 1 1 1 月到 12 12 12 月。

输入一个日期的英文形式, 请输出它的数字形式。

输入格式

输入一个日期的英文形式。

输出格式

输出一行包含两个整数,分别表示日期的月和日。

样例 #1

样例输入 #1

Feb08

样例输出 #1

2 8

样例 #2

样例输入 #2

Oct18

样例输出 #2

10 18
#include<bits/stdc++.h>

using namespace std;
int main() {
	string s;
	int j=0;
	string a[13]={"0","Jan","Feb","Mar","Apr","May",
	"Jun","Jul","Aug","Sep","Oct","Nov","Dec"};
	cin>>s;
	for(int i=1;i<=12;i++){
		if(s.substr(0,3)==a[i]) 
		cout<<i<<' '<<stoi(s.substr(3,2));
	}
	return 0;
}

几个函数

1.substr 提取子字符串。

std::string substr (size_t pos, size_t len) const;

pos 表示要提取的子字符串的起始位置
len 表示要提取的子字符串的长度
返回值是从原字符串中提取出的子字符串。

2.stoi() 字符串转换为整数。(string to int)

这个函数以字符串作为输入,返回相应的整数值。

#include <iostream>
#include <string>

int main() {
    std::string str = "12345";
    int num = std::stoi(str);
    std::cout << "The number is: " << num << std::endl;  // 输出结果为 "The number is: 12345"

    return 0;
}

3.to_string 数字转换为字符串

这个函数可以接受各种数字类型(例如整数、浮点数等),并返回对应的字符串表示。

以下是 to_string 的基本用法示例:

#include <iostream>
#include <string>

int main() {
    int num = 12345;
    std::string str = std::to_string(num);
    std::cout << "The string is: " << str << std::endl;  // 输出结果为 "The string is: 12345"

    return 0;
}

在这个示例中,我们使用 std::to_string 函数将整数 12345 转换为字符串,并将结果存储在变量 str 中。

to_string 还可以用于浮点数和其他数字类型:

double pi = 3.14159;
std::string piString = std::to_string(pi);

[蓝桥杯 2019 省 B] 特别数的和

题目描述

小明对数位中含有 2 2 2 0 0 0 1 1 1 9 9 9 的数字很感兴趣(不包括前导 0 0 0),在 1 1 1 40 40 40 中这样的数包括 1 1 1 2 2 2 9 9 9 10 10 10 32 32 32 39 39 39 40 40 40,共 28 28 28 个,他们的和是 574 574 574

请问,在 1 1 1 n n n 中,所有这样的数的和是多少?

输入格式

输入一行包含一个整数 n n n

输出格式

输出一行,包含一个整数,表示满足条件的数的和。

样例 #1

样例输入 #1

40

样例输出 #1

574

提示

对于 20 % 20\% 20% 的评测用例, 1 ≤ n ≤ 10 1 \le n \le 10 1n10

对于 50 % 50\% 50% 的评测用例, 1 ≤ n ≤ 100 1 \le n \le 100 1n100

对于 80 % 80\% 80% 的评测用例, 1 ≤ n ≤ 1000 1 \le n \le 1000 1n1000

对于所有评测用例, 1 ≤ n ≤ 10000 1 \le n \le 10000 1n10000

#include<bits/stdc++.h>
using namespace std;
bool check(int n){
	while(n){
		if(n%10==2||n%10==0||n%10==1||n%10==9) return true;
		else n=n/10; 
	}
	return false;
}
int main() {
	int num,sum=0;
	string s;
	cin>>num;
	for(int i=1;i<=num;i++){
		if(check(i)) sum+=i;
	} 
	cout<<sum;
	return 0;
}

一定要保留bool函数内的return true与false
如果你移除了 return false,在这种情况下,如果 n 不满足任何一个条件(不包含 0、1、2 或 9),那么该函数将不会显式地返回一个值。

根据 C++ 的规定,在没有明确返回值的情况下,函数的行为是未定义的。

这意味着程序的行为可能因为缺少返回语句而变得不可预测。

因此,即使在编译器中没有报错,也应该在函数的逻辑中确保所有的情况都有明确的返回值,以保证程序的正确性。

因此,为了让你的代码更健壮和清晰,最好保留 return false 以确保所有情况下函数都有明确的返回值。

[蓝桥杯 2013 省 B] 翻硬币

题目背景

小明正在玩一个“翻硬币”的游戏。

题目描述

桌上放着排成一排的若干硬币。我们用 * 表示正面,用 o 表示反面(是小写字母,不是零),比如可能情形是 **oo***oooo,如果同时翻转左边的两个硬币,则变为 oooo***oooo。现在小明的问题是:如果已知了初始状态和要达到的目标状态,每次只能同时翻转相邻的两个硬币,那么对特定的局面,最少要翻动多少次呢?

输入格式

两行等长字符串,分别表示初始状态和要达到的目标状态,每行长度小于 1000 1000 1000

数据保证一定存在至少一种方案可以从初始状态和要达到的目标状态。

输出格式

一个整数,表示最小操作步数。

样例 #1

样例输入 #1

**********
o****o****

样例输出 #1

5

样例 #2

样例输入 #2

*o**o***o***
*o***o**o***

样例输出 #2

1
#include <bits/stdc++.h>
using namespace std;

int main() {
	string a,b;
	cin>>a>>b;
	int l=a.size(),num=0,i;
	for(i=0;i<l;i++){
		if(a[i]!=b[i]){
			a[i]=(a[i]=='*'?'o':'*');
			a[i+1]=a[i+1]=='*'?'o':'*';
			num++;
		}
	}
	cout<<num;
	return 0;
}
  • 16
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值