14届蓝桥杯第一期模拟赛题解
某些原因题面已经无法找到,题面的描述会比较简单,且本篇文章重点是写法上。
A题-二进制位数(填空题)
题面
输出2022的二进制表示的位数。
算法(模拟)
直接模拟即可。
代码(C++)
答案:11
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
int main()
{
int x = 2022;
string s;
while(x) {
s += x % 2 + '0';
x /= 2;
}
// cout << s << endl;
cout << s.size() << endl;
return 0;
}
B题-晨跑(填空题)
题面
2022这一年中,小明会在星期六和星期天以及每个月的1、11、21、31号进行跑步,现在已知2022年1月1日为星期六,求这一年中小明跑步的天数。
算法(枚举)
模拟赛的时候是直接用日历数的。
代码(c++)
答案:138
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
int main()
{
cout << 13 + 11 + 12 + 12 + 11 + 10
+ 13 + 11 + 10 + 13 + 11 + 11 << endl;
return 0;
}
C题-调和级数(填空题)
题面
求调和级数的累加和 S S S大于12的最小项数。
算法(二分)
很直观的是,调和级数会随着项数的增加,它的累加和 S S S会单调增加,二分即可。
代码(c++)
答案:91380
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
double get(int n)
{
double res = 0;
for(int i = 1; i <= n; i ++) {
res += 1.0 / (i * 1.0);
}
return res;
}
int main()
{
double res = 0;
for(int i = 1; i <= 200000; i ++) {
res += 1.0 / (i * 1.0);
}
int l = 0, r = 200000;
while(l < r)
{
int mid = l + r >> 1;
if(get(mid) > 12) r = mid;
else l = mid + 1;
}
// cout << get(r - 1) << endl;
// cout << get(r) << endl;
cout << r << endl;
return 0;
}
D题-山谷(填空题)
题面
在一个大写英文字母构成的 30 × 60 30 \times 60 30×60矩阵中,定义一个山谷为:一个非矩阵边界的位置,并且该位置的字母都小于其上下左右的字母。请计算该矩阵中山谷的个数。(大写字母的从小到大的排序: A B C . . . X Y Z ABC...XYZ ABC...XYZ)
本题的输入在文章底部。
算法(枚举)
枚举每一个非边界的位置,并判断其上下左右的字母是否都大于其本身的字母值即可。
代码(c++)
答案:276
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 65;
int dx[4] = {-1, 0, 1, 0}, dy[4] = {0, 1, 0, -1};
int n = 30, m = 60;
char g[N][N];
bool check(int x, int y)
{
for(int i = 0; i < 4; i ++)
{
int a = x + dx[i], b = y + dy[i];
if(g[a][b] <= g[x][y]) return false;
}
return true;
}
int main()
{
for(int i = 1; i <= 30; i ++) cin >> g[i] + 1;
// for(int i = 1; i <= n; i ++)
// {
// for(int j = 1; j <= m; j ++)
// cout << g[i][j];
// puts("");
// }
//
int res = 0;
for(int i = 2; i <= n - 1; i ++)
for(int j = 2; j <= m - 1;j ++)
{
if(check(i, j)) res ++;
}
cout << res << endl;
return 0;
}
E题-最小矩阵(填空题)
题面
给定 100 × 100 100 \times 100 100×100的矩阵,该矩阵第一行第一列的值为 1 1 1, 其余每一个位置的值满足:比其左边的大2,比其上面的大1。输该矩阵个矩阵中子矩阵的和等于 2022 2022 2022的子矩阵大小(行数 × \times ×列数),并且该输出的值需要最小。
算法(枚举,二维前缀和)
暴力是 1 e 8 × 100 × 100 1e8 \times 100 \times 100 1e8×100×100,程序跑不出来,可以在计算某一个子矩阵的和时,使用二维前缀和进行优化。
代码(C++)
答案:12
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 110;
int n= 100, m = 100;
int g[N][N];
int s[N][N];
int get(int a, int b, int c, int d)
{
return s[c][d] - s[a - 1][d] - s[c][b - 1] + s[a - 1][b - 1];
}
int main()
{
g[1][1] = 1;
for(int i = 1; i <= n; i ++)
for(int j = 1; j <= m; j ++)
{
if(i == 1 && j == 1) continue;
if(i == 1)
{
g[i][j] = g[i][j - 1] + 2;
}
if(j == 1)
{
g[i][j] = g[i - 1][j] + 1;
}
if(i > 1 && j > 1)
{
g[i][j] = g[i - 1][j] + 1;
}
}
// for(int i = 1; i <= n; i ++)
// {
// for(int j = 1; j <= m; j ++)
// cout << g[i][j] << ' ';
// puts("");
// }
for(int i = 1; i <= n; i ++)
for(int j = 1; j <= n; j ++)
s[i][j] = s[i - 1][j] + s[i][j - 1] + g[i][j] - s[i - 1][j - 1];
int res = 1e9;
for(int a = 1; a <= n; a ++)
for(int b = 1; b <= m; b ++)
for(int c = a; c <= n; c ++)
for(int d = b; d <= m; d ++)
{
if(get(a, b, c, d) == 2022)
{
res = min(res, (c - a + 1) * (d - b + 1));
}
}
cout << res << endl;
return 0;
}
F题-核酸日期
题面
如果周一做核酸,周二显示核酸天数为 1 1 1天,周三显示 2 2 2天,以此类推,周六显示 5 5 5天,周日显示 6 6 6天。小蓝在某一天做了一次核酸,请问他的核酸显示为几天。已知做核酸和查看核酸不是在同一天,而且相差不超过 6 6 6天。(显示的数为 1 1 1到 6 6 6之间的数)
输入格式
输入第一行包含一个整数 s s s,表示小蓝做核酸是周几。 s s s为 1 1 1到 6 6 6依次表示周一到周六, s s s为 7 7 7表示周日。
第二行包含一个整数 t t t,表示查看核酸是周几。 t t t为 1 1 1到 6 6 6依次表示周一到周六, t t t为 7 7 7表示周日。
输出格式
输出一行包含一个整数,表示答案。
数据范围
1 < = s , t < = 7 1 < = s , t < = 7 1<=s,t<=7
算法(模拟)
阅读理解后,模拟即可。
代码(C++)
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
int n, m;
int main()
{
cin >> n >> m;
if(m < n) m += 7;
cout << m - n << endl;
return 0;
}
G题-英文转化
题面
输入一个由小写英文字母组成的字符串,请将其中的元音字母( a a a, e e e, i i i, o o o, u u u)转换成大写,其它字母仍然保持小写。
输入格式
输入一行包含一个字符串。
输出格式
输出转换后的字符串。
数据范围
字符串的长度不超过100。
算法(模拟)
从前往后枚举每一个字母,如果当前字母为元音字母,则将其变为大写,否则跳过。
代码(C++)
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
bool check(char c)
{
if(c == 'a') return true;
if(c == 'e') return true;
if(c == 'i') return true;
if(c == 'o') return true;
if(c == 'u') return true;
return false;
}
int main()
{
string s;
cin >> s;
for(int i = 0; i < s.size(); i ++)
{
char c = s[i];
if(check(c)) s[i] -= 32;
}
cout << s << endl;
return 0;
}
H题-充电器
题面
输入格式
输出格式
数据范围
算法
代码(C++)
I题-全相等三角形
题面
输入格式
输出格式
数据范围
算法
代码(C++)
J题-最小下标
题面
输入格式
输出格式
数据范围
算法
代码(C++)
附录
D题输入
PHQGHUMEAYLNLFDXFIRCVSCXGGBWKFNQDUXWFNFOZVSRTKJPREPGGXRPNRVY
STMWCYSYYCQPEVIKEFFMZNIMKKASVWSRENZKYCXFXTLSGYPSFADPOOEFXZBC
OEJUVPVABOYGPOEYLFPBNPLJVRVIPYAMYEHWQNQRQPMXUJJLOOVAOWUXWHMS
NCBXCOKSFZKVATXDKNLYJYHFIXJSWNKKUFNUXXZRZBMNMGQOOKETLYHNKOAU
GZQRCDDIUTEIOJWAYYZPVSCMPSAJLFVGUBFAAOVLZYLNTRKDCPWSRTESJWHD
IZCOBZCNFWLQIJTVDWVXHRCBLDVGYLWGBUSBMBORXTLHCSMPXOHGMGNKEUFD
XOTOGBGXPEYANFETCUKEPZSHKLJUGGGEKJDQZJENPEVQGXIEPJSRDZJAZUJL
LCHHBFQMKIMWZOBIWYBXDUUNFSKSRSRTEKMQDCYZJEEUHMSRQCOZIJIPFION
EEDDPSZRNAVYMMTATBDZQSOEMUVNPPPSUACBAZUXMHECTHLEGRPUNKDMBPPW
EQTGJOPARMOWZDQYOXYTJBBHAWDYDCPRJBXPHOOHPKWQYUHRQZHNBNFUVQNQ
QLRZJPXIOGVLIEXDZUZOSRKRUSVOJBRZMWZPOWKJILEFRAAMDIGPNPUUHGXP
QNJWJMWAXXMNSNHHLQQRZUDLTFZOTCJTNZXUGLSDSMZCNOCKVFAJFRMXOTHO
WKBJZWUCWLJFRIMPMYHCHZRIWKBARXBGFCBCEYHJUGIXWTBVTREHBBCPXIFB
XVFBCGKCFQCKCOTZGKUBMJRMBSZTSSHFROEFWSJRXJHGUZYUPZWWEIQURPIX
IQFLDUUVEOOWQCUDHNEFNJHAIMUCZFSKUIDUBURISWTBRECUYKABFCVKDZEZ
TOIDUKUHJZEFCZZZBFKQDPQZIKFOBUCDHTHXDJGKJELRLPAXAMCEROSWITDP
TPCCLIFKELJYTIHRCQAYBNEFXNXVGZEDYYHNGYCDRUDMPHMECKOTRWOSPOFG
HFOZQVLQFXWWKMFXDYYGMDCASZSGOVSODKJGHCWMBMXRMHUYFYQGAJQKCKLZ
NAYXQKQOYZWMYUBZAZCPKHKTKYDZIVCUYPURFMBISGEKYRGZVXDHPOAMVAFY
RARXSVKHTQDIHERSIGBHZJZUJXMMYSPNARAEWKEGJCCVHHRJVBJTSQDJOOTG
PKNFPFYCGFIEOWQRWWWPZSQMETOGEPSPXNVJIUPALYYNMKMNUVKLHSECDWRA
CGFMZKGIPDFODKJMJQWIQPUOQHIMVFVUZWYVIJGFULLKJDUHSJAFBTLKMFQR
MYJFJNHHSSQCTYDTEAMDCJBPRHTNEGYIWXGCJWLGRSMEAEARWTVJSJBAOIOJ
LWHYPNVRUIHOSWKIFYGTYDHACWYHSGEWZMTGONZLTJHGAUHNIHREQGJFWKJS
MTPJHAEFQZAAULDRCHJCCDYRFVVRIVUYEEGFIVDRCYGURQDREDAKUBNFGUPR
OQYLOBCWQXKZMAUSJGMHCMHGDNMPHNQKAMHURKTRFFACLVGRZKKLDACLLTEO
JOMONXRQYJZGINRNNZWACXXAEDRWUDXZRFUSEWJTBOXVYNFHKSTCENAUMNDD
XFDMVZCAUTDCCKXAAYDZSXTTOBBGQNGVVPJGOJOGLMKXGBFCPYPCKQCHBDDZ
WRXBZMQRLXVOBTWHXGINFGFRCCLMZNMJUGWWBSQFCIHUBSJOLLMSQSGHMCPH
ELSOTFLBGSFNPCUZSRUPCHYNVZHCPQUGRIWNIQXDFJPWPXFBLKPNPEELFJMT