2021校赛

Posted 数学小学霸

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2021校赛相关的知识,希望对你有一定的参考价值。

2021校赛

2021-05-31

前言

记录一次程序设计校赛,我做了6题,拿到了非计算机专业的第1,总排名是第9。继续加油!

A_A+B Problem

A+B Problem 是每个 ICPCer 的第一题(雾),对于蒟蒻 cjw 而言也是。
每天他都会 AC 一次 A+B Problem,来告诉自己很棒。
但是今天出了点小状况:一只 zzh 在外投喂的喵咪来 ICPC 实验室找 zzh,但被实验室
的人告知 zzh 在外面有猫了。小猫咪可听不得这话,气地上窜下跳:“明明是我先来的!为什
么……”,小猫咪随即跳到了键盘上,无意中在 A+B Problem 的数据中按下了许多英文字符
(也可能没有)。
就在 cjw 想要改回来时,实验室队长叫住了他, " 你把这题写一下, 输出要和之前的一
样"。这对蒟蒻 cjw 来说宛若晴天霹雳,因为他只会写 A+B Problem。
" 这可怎么办? ",他听说 SCUECer 都很厉害,便萌生了向 SCUECer 求助的念头,所以
你能帮帮他吗?
输入数据
输入两个字符串,代表正整数 A 和 B 插入英文字符后(也可能没有)的字符串。
两个字符串用空格隔开,同时, 每个字符串的长度不超过 7。
输出数据
输出一个整数,代表 A + B 的结果。
样例输入 1
1d34a 54mF
样例输出 1
188
样例输入 2
1805296 114514
样例输出 2
1919810
 #include <iostream>
 #include <cstdio>
 #include <vector>
 #include <cstring>
 #include <string>
 #include <algorithm>
 
 using namespace std;
 
 long long res1, res2;
 vector<long long> v1, v2;
 
 int main() {
 	string str1, str2;
 	cin >> str1 >> str2;
 	for (int i = 0; i < str1.size(); ++i) {
 		if (str1[i] >= '0' && str1[i] <= '9') {
 			v1.push_back(str1[i]);
		}	
	}
	for (int i = 0; i < str2.size(); ++i) {
		if (str2[i] >= '0' && str2[i] <= '9') {
			v2.push_back(str2[i]);
		}
	}
	for (int i = 0; i < v1.size(); ++i) {
		res1 = res1 * 10 + v1[i] - '0';
	}
	for (int i = 0; i < v2.size(); ++i) {
		res2 = res2 * 10 + v2[i] - '0';
	}
 	printf("%lld\\n", res1 + res2);
 	return 0;
 }

B_S11

祝贺 RNG 在 MSI 取得了冠军!
一共有 n 只队伍入围了了 S11 世界总决赛, LPL 的 GESS 战队是其中之一,编号为 n。
GESS 战队有一个能力值 m, TCZZ 找到了一位仙姑去预测 GESS 战队能不能取得 S11
的冠军。仙姑已经预知了所有入围 S11 的战队的信息,这些战队编号为 [1, n − 1],每个战队
有两个信息,能力值 ai 和收益值 bi。如果 GESS 战队的能力值不小于编号为 i 战队的能力
值,那么 GESS 战队可以打败这个战队,并且获得这个战队的收益值(也就是 GESS 战队的能
力值会加上 bi)。
因为买通了拳头官方, GESS 战队只要能打败所有战队就能拿到冠军,而且他可以任意安
排每一场的对手,每个战队只能比赛一次且只会和 GESS 对决。
虽然这个仙姑能预知所有队伍信息,但是她是个笨蛋,所以想问你 GESS 战队有没有可能
拿到冠军,如果有可能获得冠军,输出"SwordfingerS11!",如果不能,输出"SwordfingerS12!"。
输入数据
第一行是战队数量 n (1 ≤ n ≤ 104),第二行是 GESS 战队的能力值 m (1 ≤ m ≤
104),接下来 n − 1 行中的第 i 行表示第 i 支战队的信息,每行两个数字 ai (1 ≤ ai ≤
104), bi (1 ≤ bi ≤ 104)。
输出数据
如果 GESS 战队有可能拿到冠军,输出一行"SwordfingerS11!",如果不能,输出一行
"SwordfingerS12!"。
样例输入 1
2
10
20 10
样例输出 1
SwordfingerS12!
样例输入 2
4
10
24 10
13 5
5 10
样例输出 2
SwordfingerS11!
注释
对于第一个样例,只有 GESS 一只战队,所以肯定是冠军。
对于第二个样例,先打败编号为 3 的战队,此时 GESS 能力值提高到 20 ,再打败编号
为 2 的战队,能力值提高到 25,再打败编号为 1 的战队,这种情况下可以获得冠军。
#include <iostream>
#include <cstdio>
#include <vector>
#include <cstring>
#include <string>
#include <algorithm>

using namespace std;

const int N = 1e4 + 5;
int n, m;
int a[N], b[N];
struct Node {
	int a;
	int b;
}node[N];

bool cmp(Node n1, Node n2) {
	if (n1.a != n2.a) {
		return n1.a < n2.a;
	}
	return n1.b > n2.b;
}

int flag = 1;

int main() {
	scanf("%d%d", &n, &m);
	for (int i = 0; i < n - 1; ++i) {
		scanf("%d%d", &node[i].a, &node[i].b);
	}
	sort(node, node + n - 1, cmp);
	for (int i = 0; i < n - 1; ++i) {
		if (m >= node[i].a) {
			m += node[i].b;
		} else {
			printf("SwordfingerS12!\\n");
			flag = 0;
		}
	}
	if (flag) {
		printf("SwordfingerS11!\\n");
	}
	return 0;
}

C_扫雷

描述
扫雷是一款为了帮助人们熟悉计算机鼠标操作而设计出来的一款益智类小游戏。 (操作系
统老师说的,我当时人都傻了)
zzh 由于受到学妹 cz 的嘲讽,决定开始学习扫雷技巧,从而成为一代扫雷 King,不过
由于速度一直提升不上去,他决定偷偷学习学妹 cz 的扫雷方式,然后用她的方法打败她。
他了解到学妹 cz 一眼就能知道咨询的格子的周围的地雷数目(除去标记地雷),由于
zzh 脑子有时候会卡机,所以他决定让你帮助他写一个程序从而实现他需要的功能。
现给出 N ∗ M 的一张图代表当前扫雷游戏的区域, # 代表当前格子是地雷, * 代表当前
格子是安全的。
给出 T 次咨询,每次咨询会给出所需要的咨询的点 (x, y),对于每次咨询你需要输出当
前咨询格子的周围 8 个方向的地雷数量 (除去已经标记地雷)。每次咨询完毕后要将当前格
子周围 8 个方向未标记的地雷进行标记。需要注意的是如果被咨询格子为地雷,那么则不需
要输出周围地雷数目,而是需要输出"X_X",并且只需要将当前格子的地雷进行标记。 (如果咨
询的是已经标记的地雷仍然输出"X_X")
咨询结束后如果所有地雷被排清,那么 zzh 就会非常开心的让你在最后输出"zzhnb!!!",
如果有地雷剩余,那么带有学习了 cz 思想的人工智能扫雷系统就会自觉的进行嘲讽,会先输
出一行"zzhtcl!!!",随后再输出一行"czyyds!!!"。
输入数据
第一行给出两个整数 N, M (1 ≤ N, M ≤ 500),其中 N 为方阵的行数, M 为方阵列数。
接下来 N 行是由 # 和 * 组成的 N ∗ M 的方阵。
第 N + 2 行会给出一个整数 T (1 ≤ T ≤ N ∗ M),代表 T 次咨询。
接下来 T 行每行会给出两个整数 x, y (1 ≤ x ≤ N, 1 ≤ y ≤ M) 代表需要咨询的点在方
阵中的位置。
输出数据
输出每次咨询的点周围未被标记的地雷的数量或者"X_X"
T 次咨询结束后判断所有地雷是否被标记。
若若方阵中地雷全部被标记则在随后一行输出"zzhnb!!!"
若方阵中地雷没有全部被标记则先输出"zzhtcl!!!" ,下一行输出"czyyds!!!"
样例输入 1
4 4
# # # #
# * * #
# * * #
# # # #
5
1 1
2 2
2 3
3 2
3 3
样例输出 1
X_X
4 3 3 1
zzhnb!!!
样例输入 2
3 3
# * #
# * #
* * *
4
1 1
3 1
3 2
3 3
样例输出 2
X_X
1 1
0
zzhtcl!!!
czyyds!!!
注释
样例一将所有雷标记故最后输出"zzhnb!!!"
样例二的 (1,3) 位置的地雷未被标记故先输出"zzhtcl!!!" ,下一行输出"czyyds!!!"。
#include <iostream>
#include <cstdio>
#include <vector>
#include <cstring>
#include <string>
#include <algorithm>

using namespace std;

/*
3 3
# * #
# * #
* * * 
4
1 1
1 1
2 2
2 2


*/
const int MAX_N = 5000 + 50;
int N, M;
char ch[MAX_N][MAX_N];
int vis[MAX_N][MAX_N];

int T;
int dx[8] = {1, -1, 0, 0, -1, -1, 1, 1};
int dy[8] = {0, 0, -1, 1, 1, -1, -1, 1};
int all_cnt;
int cnt;
void check(int ti, int tj) {
	
	int now_cnt = 0;
	for (int i = 0; i < 8; ++i) {
		int tx = ti + dx[i];
		int ty = tj + dy[i];
		if (tx < 1 || ty < 1 || tx > N || ty > M) {
			continue;
		}
		if (ch[tx][ty] == '#' && vis[tx][ty] == 0) {
			vis[tx][ty] = 1;
			now_cnt++;
			cnt++;
			// printf("i=%d j=%d\\n", tx, ty);
		}
	} 
	printf("%d\\n", now_cnt);
}

int main() {
	scanf("%d%d", &N, &M);
	for (int i = 1; i <= N; ++i) {
		for (int j = 1; j <= M; ++j) {
			cin >> ch[i][j];
			if (ch[i][j] == '#') {
				all_cnt++;
			}
		}
	}
//	for (int i = 1; i <= N; ++i) {
//		for (int j = 1; j <= M; ++j) {
//			cout << ch[i][j];
//		}
//		puts("");
//	}
	scanf("%d", &T);
	while (T--) {
		int x, y;
		scanf("%d%d", &x, &y);
		if (ch[x][y] == '#') {
			if (vis[x][y] == 0) { // keng!
				vis[x][y] = 1;
				cnt++;
			}
			printf("X_X\\n");
		} else {
			check(x, y);
		}
	}
	if (cnt == all_cnt) {
		printf("zzhnb!!!\\n");
	} else {
		printf("zzhtcl!!!\\n");
		printf("czyyds!!!\\n");
	}
	return 0;
}

D_女朋友

描述
众所周知,女朋友总会给自己的另一半提出各种刁钻的需求,而小 A 今天遇到了其中最
刁钻的一个。
今天,小 A 的女朋友想喝咖啡,并且她认为甜度为 k 的咖啡最美味。但小 A 家只有两
种甜度类型的咖啡无限罐,低糖咖啡的甜度为 a , 高糖咖啡的甜度为 b ,两杯咖啡的容量相
同。现在小 A 的女朋友要求小 A 使用这两类甜度的咖啡调理出甜度尽可能接近 k 的咖啡。
但事情并不简单,为了刁难小 A,女朋友要求必须将高糖咖啡和低糖咖啡轮流地整罐倒入
到一个无限容量的容器中(第一次倒入一罐高糖咖啡,第二次倒入一罐低糖咖啡,第三次倒入
一罐高糖咖啡...),她现在想知道,当容器中咖啡的甜度最接近 k 的时候,至少需要倒入多
少杯咖啡。
(注意:必须按照第 1 罐高糖、第 2 罐低糖、第 3 罐高糖、第 4 罐低糖...,这样的顺
序倒入)
输入数据
第一行给出一个整数 T (1 ≤ T ≤ 3 × 104),代表有多少组测试用例。
接下来给出 T 行数据,每行给出三个空格分割的整数 b, a 和 k (k, a, b 均为整数, 1 ≤
a < b ≤ 106, a ≤ k ≤ b ),分别代表高糖咖啡的甜度、低糖咖啡的甜度和小 A 女朋友期望喝
到的甜度。
输出数据
共输出 T 行数据,每行为一个正整数,代表使容器中的咖啡甜度最接近 k 时,倒入容
器的咖啡的最小罐数。
样例输入 1
3
30 10 20
41 15 30
18 13 18
样例输出 1
2 7 1
提示
一杯咖啡甜度的计算方法是其中所有倒入罐装咖啡的甜度和/倒入的罐装咖啡数。
在第一组测试用例中,当我们向容器中倒入一罐高糖咖啡和一罐低糖咖啡后,容器中咖啡
的甜度正好为 k ,因此答案是 2 罐。
在第二组测试用例中,当我们倒入 7 罐咖啡后(共计 4 罐高糖咖啡 3 罐低糖咖啡),容
器中咖啡的甜度为 29.857,继续倒入更多咖啡也永远不可能使甜度比 29.857 更接近 k。
在第三组测试用例中,倒入第一杯咖啡后(第一杯一定是高糖咖啡),甜度正好达到了 k,
因此答案是 1。
#include <iostream>
#include <cstdio>
#include <vector>
#include <cstring>
#include <string>
#include <algorithm>
#include <cmath>

using namespace std;
typedef unsigned long long ULL;
//const int N = 3 * 1e4 + 10;

int T;
int cnt;

//struct Node {
//	int b;
//	int a;
//	int k;
//}node[N];
double vv[N];

int main() {
	scanf("%d", &T);
	for (int i = 0; i < T; ++i) {
		int b, a, k;
		int res = 0;
		int cnt = 0;
		int all = 0;
		int flag = 0;
		double v = 0;
		double v_min = 999999999;
		int idx = 0;
		int cnt_da = 0;
		scanf("%d%d%d", &b, &a, &k);
		while(1) {
			
			v_old = v;
			if (!flag) {
				all += b;
				flag = 1;
			} else {
				all += a;
				flag = 0;
			}
			cnt++;
			if ((double)all / (double)cnt == k) {
				break;
			}
			
			v = fabs((double)all / (double)cnt - k);
			v_min = min(v_min, v);
			vv[idx++] = v;
			if ()
			
		}
		printf("%d\\n", cnt);
	}
	return 0;
}

F_九栋的猫

描述
五月初,立夏已至,九栋的小花和大橘诞生了它们爱情的结晶——一窝可爱的小猫咪,凭
借小猫咪们的卖萌,小花成为了九栋最受欢迎的猫猫。小花和我们实验室渊源颇深, 14 级的
chy 学长将它养大,于是 acmer 更加爱护小花一家了。
这天在九栋后院阳光下,小花把它的 n 只小猫咪排成一排,路过的 acmer 十分不解。这
时,精通喵语的 zzh 站了出来,经过和小花的一番沟通,我们得知小花从古老的典籍《萌新程
序喵的养成方法》中看到一个计算小猫咪可爱指数的方法:将小猫咪们从左至右排成一排,每
只小猫咪都有一个受人欢迎值 ci, 但是每只猫的可爱值和它的受人欢迎值没有直接关系。可
爱值的计算需要两次操作,当小花从左向右看时,它只会记住到现在为止看过的受人欢迎值最
大的猫咪,记为 cl;当小花从右向左看时,她只会记住到现在为止看过的受人欢迎值最小的猫
咪,记为 cr。每只小猫咪的可爱指数是小花分别从左向右看到当前位置的 cl 和从右向左看到
当前位置的 cr 的乘积,即 cl ∗ cr。
小花不知道如何计算所有小猫咪的可爱值之和, zzh 作为最菜的 acmer 也不会算,所以
小花只能拜托屏幕前的各位。
输入数据
第一行一个正整数 T (1 ≤ T ≤ 100) ,代表该测试点下测试用例的数目。
接下来的每个测试用例,第一行输入一个正整数 n (1 ≤ n ≤ 105),第二行输入空格隔开
的 n 个正整数 ci (1 ≤ ci ≤ 100)。
题目保证每个测试点下 ∑ n ≤ 105。
输出数据
对于每个测试用例输出一个正整数,代表所有小猫咪的可爱指数之和。
样例输入 1
2 5
1 2 3 2 1
8
18 3 10 21 1 14 99 45
样例输出 1
12
9300
注释
对于第一个样例:
• 第一只小猫的 cl = 1, cr = 1,可爱值为 1。
• 第二只小猫的 cl = 2, cr = 1,可爱值为 2。
• 第三只小猫的 cl = 3, cr = 1,可爱值为 3。
• 第四只小猫的 cl = 3, cr = 1,可爱值为 3。
• 第五只小猫的 cl = 3, cr = 1,可爱值为 3。
综上所有小猫咪的可爱值之和为 1 + 2 + 3 + 3 + 3 = 12。
#include <iostream>
#include <cstdio>
#include <vector>
#include <cstring>
#include <string>
#include <algorithm>

using namespace std;
typedef unsigned long long ULL;
ULL res;

int T;
const int N = 1e6 + 10;
int c[N];
struct Node {
	int v_min;
	int v_max;
}node[N];

int main() {
	scanf("%d", &T);
	while (T--) {
		res = 0;
		int v_min = 99999999, v_max = -99999999;
		int x;
		scanf("%d", &x);
		for (int i = 0; i < x; ++i) {
			scanf("%d", &c[i]);
		}
		for (int i = 0; i < x; ++i) {
			v_max = max(v_max, c[i]);
			node[i].v_max = v_max;
		}
		for (int i = x - 1; i >= 0; --i) {
			v_min = min(v_min, c[i]);
			node[i].v_min = v_min;
		}
		for (int i = 0; i < x; ++i) {
			res = res + node[i].v_max * node[i].v_min;
			// printf("%d %d\\n", node[i].v_max, node[i].v_min);
		}
		printf("%llu\\n", res);
	}
	return 0;
}

G_采蘑菇

描述
zzh 和 lyk 从食用菌栽培学这门公选课程中领略到了种蘑菇的艰难程度。由于种完蘑菇
后过度劳累,他们决定让学弟 wcr 来帮助他们采摘蘑菇。他们觉得相比于他们种蘑菇的辛苦
程度而言, wcr 仅仅只是采摘蘑菇简直太容易了,所以他们决定将各个蘑菇袋子放进迷宫里面
让 wcr 寻找它们并采摘。
给出一个 N ∗ M 的迷宫,每个格子都是大小相等的正方形,每个格子要么是毒蘑菇 `*`
(不允许通过)要么是普通蘑菇 `.`(可以通过) 或者空地 `#` (可以通过), zzh 和 lyk 允
许你多次从任意地方(除了不允许走的位置)进入迷宫,但是进入迷宫后你只能按照上、下、
左、右四个方向移动,由于 zzh 和 lyk 想让 wcr 多刷刷微信步数,锻炼一下身体,所以他
们想让 wcr 把迷宫中所有可达的地方走个遍,统计出普通蘑菇的数量,然后计算出所有含有
普通蘑菇的连通区域数量与所有连通区域数量的比值 (要求输出浮点数,在误差在 10−7 范
围内均视为正确)。
可是学弟 wcr 脑子里面整天只有奇怪的东西,无法计算出正确答案,请你写个程序帮助
他解决这个问题。
输入数据
第一行为两个正整数 N, M (1 ≤ N, M ≤ 500) , 代表大小为 N ∗ M 的迷宫。
下面 N 行为由 `*` 、 `#` 、 `.` 组成的迷宫。
输出数据
第一行输出普通蘑菇的数量
接下来一行输出一个浮点数表示含有普通蘑菇的连通区域数量与所有连通区域数量的比
值 (保证分母不为 0)。
样例输入 1
3 3
# * #
# * #
# * #
样例输出 1
0 0
样例输入 2
3 3
. * #
# * .
. * #
样例输出 2
3 1
样例输入 3
4 4
. * # #
* . # #
* * * *
# # * #
样例输出 3
2
0.5
注释
样例一中有两个连通块但没有连通块含有普通蘑菇所以输出 0
样例二中有两个连通块每个连通块都含有普通蘑菇所以输出 1
样例三中有四个连通块有两个连通块含有普通蘑菇所以输出 0.5
#include <iostream>
#include <cstdio>
#include <vector>
#include <cstring>
#include <string>
#include <algorithm>
#include <queue>

using namespace std;

/*
3 3
. * .
# * .
# * .


4 4
. . * #
* . * #
* * * #
# # * #

*/
const int MAX_N = 5000 + 10;
int N, M;
char ch[MAX_N][MAX_N];
以上是关于2021校赛的主要内容,如果未能解决你的问题,请参考以下文章

DP坑多HNU2021校赛Doorman门童

DP坑多HNU2021校赛Doorman门童

[MCTF] 2021校赛题解

[MCTF] 2021校赛题解

[MCTF] 2021校赛题解

2021杭电多校赛2021“MINIEYE杯”中国大学生算法设计超级联赛签到题15869