14届蓝桥杯第一期模拟赛题解[官方模拟赛]

发布于:2022-11-15 ⋅ 阅读:(1268) ⋅ 点赞:(0)

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

网站公告

今日签到

点亮在社区的每一天
去签到