2031: [蓝桥杯2022初赛] 九进制转十进制
题目描述
九进制正整数(2022) 转换成十进制等于多少?
这是一道结果填空的题,你只需要算出结果后提交即可。
本题的结果为一个整数,在提交答案时只输出这个整数,输出多余的内容将无法得分。
分类标签
由题目可知,本题要求我们掌握进制的相互转换。如二进制转换十进制:
1011(2)=
=1+2+16=19(10)
同理,九进制转换十进制就是
本人是直接手算,直接输出答案。
#include <iostream>
using namespace std;
int main()
{
cout << 1478 << endl;
return 0;
}
2032: [蓝桥杯2022初赛] 顺子日期
题目描述
小明特别喜欢顺子。顺子指的就是连续的三个数字:123、456 等。
顺子日期指的就是在日期的 yyyymmdd 表示法中,存在任意连续的三位数是一个顺子的日期。
例如20220123 就是一个顺子日期,因为它出现了一个顺子:123;
本题顺子的定义:i j k 是一个顺子,满足 i+1=j、j+1=k、i≥0。
而20221023 则不是一个顺子日期,它一个顺子也没有。
小明想知道在整个2022年份中,一共有多少个顺子日期。
这是一道结果填空的题,你只需要算出结果后提交即可。
本题的结果为一个整数,在提交答案时只输出这个整数,输出多余的内容将无法得分。
分类标签
读懂题意之后就可以进行解答了,我是直接手算,需要注意的是012也包含在顺子日期内。
#include <iostream>
using namespace std;
int main()
{
cout << 14 << endl;
return 0;
}
当然这题也可以编程解答,参照y总的方法,学到了sprintf的用法 sprintf函数可以将数据打印到字符串中
#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
const int months[]
{
0,31,28,31,30,31,30,31,31,30,31,30,31
};//从0月开始依次枚举每个月份天数,2022年2月只有28天,作为辅助数组。
bool check(string str)
{
for (int i = 0; i + 2 < str.size(); i++)//i+2防止越界
{
if (str[i + 1] == str[i] + 1 && str[i + 2] == str[i] + 2)
return true;
}
return false;
}//判断是否为顺子日期
int main()
{
int year = 2022, month = 1, day = 1;
int res = 0;
for (int i = 0; i < 365; i++)
{
char str[10];
sprintf(str, "%04d%02d%02d", year, month, day);
if (check(str))
{
res++;
cout << str << endl;
}
day++;
if (day > months[month])//与++day等效
{
day = 1;
month++;
}
}
cout << res << endl;
return 0;
}
输出结果:
20220120
20220121
20220122
20220123
20220124
20220125
20220126
20220127
20220128
20220129
20221012
20221123
20221230
20221231
14
如果是手算的可以对照一下。
2033: [蓝桥杯2022初赛] 刷题统计
题目描述
小明决定从下周一开始努力刷题准备蓝桥杯竞赛。
他计划周一至周五每天做 a 道题目,周六和周日每天做 b 道题目。
请你帮小明计算,按照计划他将在第几天实现做题数大于等于 n 题?
输入格式
输入一行包含三个整数a, b 和n.
50% 的评测用例:1 ≤ a, b, n ≤ 10^6;
100% 的评测用例:1 ≤ a, b, n ≤ 10^18。
输出格式
输出一个整数代表天数。
输入样例 复制
10 20 99
输出样例 复制
8
分类标签
一道考验数学思维的题,我们可以发现小明的做题数每一个星期一循环,所以可以以此来降低数据规模,接着我们可以依次枚举七天,也可以直接讨论。
直接讨论:
#include <iostream>
using namespace std;
int main()
{
long long int a, b, n,s1,s2,day;
cin >> a >> b >> n;
s1 = n / (5 * a + 2 * b);
day = s1 * 7;//每七天一循环
s2 = n % (5 * a + 2 * b);//剩余的题数
if (s2 <= a && s2) day++;
else if (s2 > a && s2 <= 5 * a) {
long long int s3 = s2 % a;
s2 /= a;
day += s2;
if (s3) day++;
}//讨论前5天
if (s2 > 5 * a && s2 <= (5 * a + 2 * b))
{
day+=5;
s2 -= 5 * a;
if (s2 <= b) day++;
if (s2 > b && s2 <= 2 * b) day += 2;
}//讨论后2天
cout << day << endl;
return 0;
}
很长,麻烦,下面是循环后直接枚举。
#include <iostream>
using namespace std;
typedef long long LL;
int main()
{
LL a, b, n;
cin >> a >> b >> n;
LL s = 5 * a + 2 * b;
LL res = n / s * 7;//7天一循环
n %= s;//剩余题数
LL d[] = { a,a,a,a,a,b,b };
for (int i = 0; n > 0; i++)
{
n -= d[i];
res++;
}//依次枚举算出剩余天数
cout << res << endl;
return 0;
}
简洁明了。
2034: [蓝桥杯2022初赛] 修剪灌木
题目描述
爱丽丝要完成一项修剪灌木的工作。
有 N 棵灌木整齐的从左到右排成一排。
爱丽丝在每天傍晚会修剪一棵灌木,让灌木的高度变为 0 厘米。
爱丽丝修剪灌木的顺序是从最左侧的灌木开始,每天向右修剪一棵灌木。
当修剪了最右侧的灌木后,她会调转方向,下一天开始向左修剪灌木。
直到修剪了最左的灌木后再次调转方向。然后如此循环往复。
灌木每天从早上到傍晚会长高 1 厘米,而其余时间不会长高。
在第一天的早晨,所有灌木的高度都是 0 厘米。爱丽丝想知道每棵灌木最高长到多高。
输入格式
一个正整数N ,含义如题面所述。
30%的测试数据:1<N≤10;
100%的测试数据:1<N≤10000。
输出格式
输出 N 行,每行一个整数,第 i 行表示从左到右第 i 棵树最高能长到多高。
输入样例 复制
3
输出样例 复制
4 2 4
分类标签
每棵灌木要想长最高,必须在爱丽丝离他最远的时候,也就是可以到达他最左边或最右边。且爱丽丝往返,所以具有对称性。
#include <iostream>
using namespace std;
int main()
{
int n; cin >> n;
for (int i = 1; i <= n; i++)
{
cout << 2 * (max(i-1,n-i)) << endl;//max左右两边的最大值
}
return 0;
}
前四题的题解。。。
一个蒟蒻仔。。。