[蓝桥杯 2022 省 B] 积木画
题目描述
小明最近迷上了积木画,有这么两种类型的积木,分别为 I 型(大小为 2个单位面积) 和 L 型 (大小为 3 个单位面积):
同时,小明有一块面积大小为2×N 的画布,画布由2×N 个 1×1 区域构成。小明需要用以上两种积木将画布拼满,他想知道总共有多少种不同的方式? 积木可以任意旋转,且画布的方向固定。
输入格式
输入一个整数 N,表示画布大小。
输出格式
输出一个整数表示答案。由于答案可能很大,所以输出其对 10000000071000000007(即 10^9+7)取模后的值。
代码表示:
#include <bits/stdc++.h>
using namespace std;
const int mod = 1e9+7,N = 1e7;
int main()
{
int f[N]={0,1,2,5};
int n;
scanf("%d",&n);
for(int i=4;i<=n;++i)
f[i] = (2*f[i-1]%mod+f[i-3]%mod)%mod;
printf("%d",f[n]);
return 0;
}
解析:
这是一道动态规划的题,利用递归的思想,寻找对应的等式。
[蓝桥杯 2013 省 AB] 错误票据
题目描述
某涉密单位下发了某种票据,并要在年终全部收回。每张票据有唯一的 ID 号,全年所有票据的 ID 号是连续的,但 ID 的开始数码是随机选定的。因为工作人员疏忽,在录入 ID 号的时候发生了一处错误,造成了某个 ID 断号,另外一个 ID 重号。
你的任务是通过编程,找出断号的 ID 和重号的 ID。数据保证断号不可能发生在最大和最小号。
输入格式
一个整数N(N<100) 表示后面数据行数,接着读入 N 行数据,每行数据长度不等,是用空格分开的若干个(不大于 100 个)正整数(不大于 105),每个整数代表一个 ID 号。
输出格式
要求程序首先输入要求程序输出 1 行,含两个整数 m,n,用空格分隔,其中,m 表示断号 ID,n 表示重号 ID。
代码表示:
#include <bits/stdc++.h>
using namespace std;
//l用于记录数组中的元素个数
int a[10001],l;
int main()
{
int N,m,n,i;
string s;//存储每行输入的字符串
cin>>N;
//忽略掉换行符,以便后续可以使用 getline 函数读取完整的一行输入
cin.ignore(numeric_limits<streamsize>::max(),'\n');
for(i=1;i<=N;i++)
{
getline(cin,s);//读取一行输入存储在字符串 s
stringstream sin(s);//stringstream 可以将字符串当作流来处理便进行后续的分割
while(sin>>a[++l]);// sin 中的每个整数依次读取并存储在数组 a
//++l 用于递增计数器 l,确保每个整数都存储在不同的位置上
}
sort(a+1,a+l+1);//给出的整数可能是乱序的所以需要先排序
for(i=2;i<=l;i++)//循环遍历
if(a[i]==a[i+1]-2) m=a[i]+1;//相差为 2说明存在断号,存在变量m
else if(a[i]==a[i+1]) n=a[i];//存在重号存在n
cout<<m<<" "<<n;
return 0;
}
心得体会:
1、cin.ignore(numeric_limits<streamsize>::max(),'\n')
是一行代码,用于清除输入流中的换行符。cin
是 C++ 标准库中的输入流对象,ignore()
是 cin
对象的成员函数。ignore()
函数用于跳过输入流中的字符,可以指定要跳过的字符数和要跳过的特定字符。numeric_limits<streamsize>::max()
返回 streamsize
类型的最大值,表示要跳过的字符数为输入流中的最大字符数。这里使用 numeric_limits<streamsize>::max()
是为了确保跳过输入流中的所有字符。'\n'
是一个字符常量,表示换行符。ignore()
函数的第二个参数是要跳过的特定字符。
所以,cin.ignore(numeric_limits<streamsize>::max(),'\n')
的作用是跳过输入流中的所有字符,直到遇到换行符为止。这样可以确保在调用 getline()
函数之前,输入流中没有遗留的换行符影响。
2、使用 stringstream
的目的是将每行输入的字符串进行分割,提取其中的整数,并将这些整数存储到数组 a
中。这样做的好处是:
1)方便提取整数:stringstream
提供了诸如 operator>>
的操作符重载,可以方便地从流中提取数据。在这里,我们使用 sin >> a[++l]
从 sin
中提取下一个整数,并将其存储到数组 a
中。
2)处理不定数量的整数:每行输入的整数数量可能不确定,使用 stringstream
可以灵活地处理不定数量的整数,而不需要提前指定数组的大小。
3)方便类型转换:stringstream
可以自动将提取的字符串转换为相应的数据类型。在这里,我们将提取的字符串转换为整数,并将其存储到数组 a
中。
[蓝桥杯 2021 省 B2] 特殊年份
题目描述
今年是 2021 年,2021 这个数字非常特殊, 它的千位和十位相等, 个位比百位大 1,我们称满足这样条件的年份为特殊年份。
输入 5个年份,请计算这里面有多少个特殊年份。
输入格式
输入 5 行,每行一个 4 位十进制数(数值范围为1000 至 9999),表示一个年份。
输出格式
输出一个整数,表示输入的 5 个年份中有多少个特殊年份。
代码表示
#include <bits/stdc++.h>
using namespace std;
int main() {
int ans = 0;
for (int i = 0; i < 5; i++) {
string input;//char input[5];
cin >> input;
int a = input[0] - '0';
int b = input[1] - '0';
int c = input[2] - '0';
int d = input[3] - '0';
if (a == c && b + 1 == d)
ans++;
}
cout << ans << endl;
return 0;
}
心得体会
用字符类型的变量表示一个数字字符时实际上它们在内存中存储的是对应的ASCII码值。 '0'的ASCII码值是48当我们想将字符类型的数字转换为相应的整数时,可以通过减去字符 '0' 的ASCII码值来实现,字符类型的数字字符与对应的整数之间具有固定的差值,即字符 '0' 的ASCII码值是48,而整数 0 的值是0,它们之间相差了48。
比较char 和string:
1、字符数组:
1)使用下标操作符 []
:可以通过索引访问字符数组中的每个字符。例如,charArray[0]
表示字符数组的第一个字符。
2)使用循环遍历:可以使用循环结构(如 for
循环或 while
循环)以递增索引的方式遍历字符数组,并逐个读取每个字符。
int main() {
// 字符数组
char charArray[] = "Hello";
// 使用下标操作符读取每个字符
for (int i = 0; charArray[i] != '\0'; i++) {
cout << charArray[i] << " ";
}
cout << endl;
// 使用循环遍历读取每个字符
int index = 0;
while (charArray[index] != '\0') {
cout << charArray[index] << " ";
index++;
}
cout << endl;
}
2、字符串对象:
1)使用下标操作符 []
:可以通过索引访问字符串对象中的每个字符。例如,str[0]
表示字符串对象的第一个字符。
2)使用循环遍历:可以使用范围-based for
循环或迭代器来遍历字符串对象,并逐个读取每个字符。
int main() {
// 字符串对象
string str = "Hello";
// 使用下标操作符读取每个字符
for (int i = 0; i < str.length(); i++) {
cout << str[i] << " ";
}
cout << endl;
// 使用范围-based for循环读取每个字符
for (char ch : str) {
cout << ch << " ";
}
cout << endl;
// 使用迭代器读取每个字符
for (string::iterator it = str.begin(); it != str.end(); ++it) {
cout << *it << " ";
}
cout << endl;
return 0;
}
[蓝桥杯 2021 省 AB2] 小平方
题目描述
小蓝发现,对于一个正整数 n 和一个小于 n 的正整数 v,将 v 平方后对 n 取余可能小于 n 的一半,也可能大于等于 n 的一半。请问,在 1 到 n−1 中, 有多少个数平方后除以 n 的余数小于 n 的一半。
例如,当 n=4 时,1,2,3 的平方除以 4 的余数都小于 4的一半。
如,当 n=5 时, 1,4 的平方除以 5 的余数都是 1,小于 5 的一半。而 2,3 的平方除以 5 的余数都是 4, 大于等于 5 的一半。
输入格式
输入一行包含一个整数 n 。
输出格式
输出一个整数,表示满足条件的数的数量。
代码表示
#include <bits/stdc++.h>
using namespace std;
int main() {
int n,ann=0;
cin>>n;
for(int i=1;i<n;++i){
if((i*i)%n<n*0.5) ann++;
}
cout<<ann;
return 0;
}
[蓝桥杯 2022 省 B] 刷题统计
题目描述
小明决定从下周一开始努力刷题准备蓝桥杯竞赛。他计划周一至周五每天做 a 道题目,周六和周日每天做 b 道题目。请你帮小明计算,按照计划他将在第几天实现做题数大于等于 n 题?
输入格式
输入一行包含三个整数 a,b 和 n.
输出格式
输出一个整数代表天数
代码表示
#include <bits/stdc++.h>
using namespace std;
long long a,b,n;
int main(){
cin>>a>>b>>n;
long long s=5*a+b*2; //一周做的题数
long long s1=n%s; //还剩几题
long long s2=n/s; //做了几周
if(s1<=5*a){//如果工作日能完成
if(s1%a==0){
cout<<s1/a+s2*7;
}else{
cout<<s1/a+1+s2*7;
}
}
else{
if((s1-5*a)>b){
cout<<s2*7+7;
}else {
cout<<s2*7+6;
}
}
return 0;
}
心得体会:
活用除号➗和取余%,整在的一个星期可以独立出来计算。
注意文章在最后提示了数据非常的大所以要用long long类型。