前言
这场的题目非常的简单啊,至于为什么有第二场,因为当时河北正在刮大风被迫停止了QwQ,个人感觉是历年来最简单的一场,如果有什么不足之处,还望补充。
试题 A: 密密摆放
【问题描述】
小蓝有一个大箱子,内部的长宽高分别是 200 、250 、240 (单位:毫米),
他要用这个大箱子来放一些同样大小的小盒子,小盒子的外部长宽高分别是
30、40、50 (单位:毫米)。小盒子允许从各个方向旋转(包括可以平放和倒
放)。
请问小蓝最多可以在一个大箱子里面放多少个小盒子。
【答案提交】
这是一道结果填空题,你只需要算出结果后提交即可。本题的结果为一个
整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。
答案:
200
试题 B: 脉冲强度之和
【问题描述】
在蓝桥电子工坊,工程师小蓝正在设计一款智能脉冲生成器,用于驱动一
种新型设备。该设备的运行依赖于特定的脉冲强度,用正整数 p 表示,其必须
满足以下三个条件:
- 可由连续 10 个正整数之和组成:即存在一个正整数 k ,使得脉冲强度
p = k + (k + 1) + (k + 2) + · · · + (k + 9) 。 - 各个数位上的数字都相同:例如 1111 、22222 、333333 等。
- 数值不超过 20255202:即 1 ≤ p ≤ 20255202。
通过计算所有符合条件的脉冲强度之和,小蓝能够优化设备运行模式。对
此,请帮助他计算这一总和。
答案:
55 + 555 + 5555 + 55555 + 555555 +5555555 = 6172830
试题 C: 25 之和
【问题描述】
小蓝最近对求和很着迷,给定一个正整数 n ,他想求从 n 开始的连续 25
个整数的和,即 n + (n + 1) + (n + 2) + · · · + (n + 24) ,请帮帮他吧。
【输入格式】
输入一行包含一个正整数 n 。
【输出格式】
输出一行包含一个整数表示答案。
【样例输入 1】
1
【样例输出 1】
325
【样例输入 2】
100
【样例输出 2】
2800
【评测用例规模与约定】
对于 40% 的评测用例,1 ≤ n ≤ 100 ;
对于所有评测用例,1 ≤ n ≤ 10000 。
答案:
应该没什么好讲的吧~
cpp
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define endl '\n'
const int N = 1e5 + 10;
int ans =0 ;
signed main() {
int n;cin >> n;
ans = 300 + 25 * n;
cout << ans;
return 0;
}
试题 D: 旗帜
【问题描述】
小蓝要画一个 LANQIAO 图形,并把这个图形做成一个旗帜。图形的形状
为一个 h×w 的矩形,其中 h 表示图形的高,w 表示图形的宽。当 h = 5,w = 10
时,图形如下所示:
LANQIAOLAN
ANQIAOLANQ
NQIAOLANQI
QIAOLANQIA
IAOLANQIAO
图形的规律是:第一行用 LANQIAO 重复填入,第二行开始,每行向左移
动一个字符,用 LANQIAO 重复填入。
小蓝需要把图形中的每个字母都剪出来,以粘贴到旗帜上,他想知道,给
定图形的高和宽,图形中有多少个 A 。
【输入格式】
输入的第一行包含两个正整数 h,w ,用一个空格分隔。
【输出格式】
输出一行包含一个整数表示答案。
【样例输入】
5 10
【样例输出】
14
【评测用例规模与约定】
对于 30% 的评测用例,h = 1 ,1 ≤ w ≤ 20 ;
对于 60% 的评测用例,1 ≤ h,w ≤ 20 ;
对于所有评测用例,1 ≤ h,w ≤ 100 。
答案:
数据量很少,不用想太复杂,直接暴力即可。
cpp
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define endl '\n'
const int N = 1e5 + 10;
int ans =0 ;
int n, m;
signed main() {
cin >> n >> m;
string s = "LANQIAO";
for (int i = 0; i <n;i++) {
int pre = i % 7;
for (int j =0;j<m;j++){
if (pre == 7) pre = 0;
if (s[pre] == 'A') ans++;
pre++;
}
}
cout << ans;
return 0;
}
试题 E: 数列差分
【问题描述】
小蓝有两个长度均为 n 的数列 A = {a1, a2, · · · , an} 和 B = {b1, b2, · · · , bn} ,将两个数列作差定义为 C = A − B = {c1 = a1 − b1, c2 = a2 − b2, · · · , cn = an − bn}。
小蓝将对数列 B 进行若干次操作,每次操作可以将数列 B 中的任意一个数更改
为任意一个整数。在进行完所有操作后,小蓝可以按任意顺序将数列 B 重排,
之后再计算数列 C 。小蓝想知道,最少操作多少次可以使得数列 C 中的所有数
都为正整数。
【输入格式】
输入的第一行包含一个正整数 n ;
第二行包含 n 个整数 a1, a2, · · · , an ,相邻整数之间使用一个空格分隔。
第三行包含 n 个整数 b1, b2, · · · , bn ,相邻整数之间使用一个空格分隔。
【输出格式】
输出一行包含一个整数表示答案。
【样例输入】
4
22 31 12 14
3 19 27 44
【样例输出】
1
【样例说明】
其中一种方案:将 44 改为 0 ,重新排列 B 为 {19, 27, 3, 0} ,使得数列
C = {3, 4, 9, 14} 均为正整数。
【评测用例规模与约定】
对于 30% 的评测用例,n ≤ 10 ;
对于所有评测用例,1 ≤ n ≤ 105 ,−109 ≤ ai ≤ 109 ,−109 ≤ bi ≤ 109 。
答案:
勉强算是这场的难题吧,排序+双指针,因为b的顺序可以打乱,因此a和b即使进行排序操作也不会影响结果。
然后在a中寻找比b的数大的值,如果当前这个a不是说明这个值需要调整。
cpp
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define endl '\n'
const int N = 1e5 + 10;
int ans =0 ;
int n, m;
int a[N], b[N];
signed main() {
cin >> n;
for (int i = 0; i < n; i++) {
cin >> a[i];
}
for (int i = 0; i < n; i++) {
cin >> b[i];
}
sort(a, a + n);
sort(b, b + n);
int idx = 0;
for (int i = 0; i < n;i++) {
if (a[i] > b[idx]) {
idx++;
}
else {
ans++;
}
}
cout << ans;
return 0;
}
试题 F: 树上寻宝
【问题描述】
小蓝正在一棵含有 n 个结点的树的根结点 1 上,他准备在这棵树上寻宝。
结点 i 上有一个物品,价值为 wi 。然而,小蓝每次寻宝只能从根节点出发走不
超过 k 步,每步只能选择走 1 条边或者 2 条边,之后会自动拾取最终停留的结
点上的物品并被传送回根结点。请求出小蓝最终能获得的物品的总价值。
【输入格式】
输入的第一行包含两个正整数 n, k ,用一个空格分隔。
第二行包含 n 个正整数 w1,w2, · · · ,wn ,相邻整数之间使用一个空格分隔。
接下来 n − 1 行,每行包含两个正整数 ui
, vi ,用一个空格分隔,表示结点
ui 和结点 vi 之间有一条边。
【输出格式】
输出一行包含一个整数表示答案。
【样例输入】
8 2
6 3 3 1 5 4 3 4
1 2
2 3
2 4
4 5
5 6
6 7
7 8
【样例输出】
22
【样例说明】
走 0 步能到的结点:1 ;
走 1 步能到的结点:2, 3, 4 ;
走 2 步能到的结点:3, 4, 5, 6 ;
因此能到的结点为:1, 2, 3, 4, 5, 6 ,能获得的总价值为 22 。
【评测用例规模与约定】
对于 20% 的评测用例,1 ≤ n ≤ 15 ;
对于所有评测用例,0 ≤ k < n ≤ 105 ,1 ≤ wi ≤ 106 ,1 ≤ ui, vi ≤ n 。
答案:
一个简单的搜索,注意考虑k为0的情况。
此外一定要存双向边,因为他题目里面写的是存在一条路径,而不是谁是谁的子节点,我有几个同学在这里挂了QwQ。
cpp
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define endl '\n'
const int N = 1e5 + 10;
int ans =0 ;
int n, k;
int w[N];
vector<int>e[N];
bool vis[N];
void bfs(int num) {
queue<int>q;
vis[1] = 1;
q.push(1);
ans = w[1];
if (num == 0) return;//这里当时写的多余了
while (num-- && q.size()) {
int a = q.size();
while (a--) {
int x = q.front();
q.pop();
for (auto i : e[x]) {
if (!vis[i]) {
vis[i] = 1;
ans += w[i];
q.push(i);
}
}
}
}
}
signed main() {
cin >> n >> k;
for (int i = 1; i <= n;i++) {
cin >> w[i];
}
for (int i = 0; i < n - 1; i++) {
int x, y;
cin >> x >> y;
e[x].push_back(y);
e[y].push_back(x);
}
bfs(2 * k);
cout << ans;
return 0;
}
试题 G: 翻转硬币
【问题描述】
给定 n 行 m 列共 n × m 个硬币,对于任意一个硬币,我们将其价值视为与
其相邻(指上、下、左、右相邻)的硬币中与其正反相同的硬币数的平方。
你可以进行任意次操作,每次可以选择任意一行并将该行的硬币全部翻转。
求所有硬币的价值之和最大可能是多少。
【输入格式】
输入的第一行包含两个正整数 n, m ,用一个空格分隔。
接下来 n 行,每行包含 m 个 0 或 1 ,表示给定的 n × m 个硬币。
【输出格式】
输出一行包含一个整数表示答案。
【样例输入】
4 4
1010
1111
1011
1100
【样例输出】
68
【样例说明】
如图,实线表示正面,虚线表示反面,翻转最后一行可以得到最大价值和:
【评测用例规模与约定】
对于 40% 的评测用例,n, m ≤ 20 ;
对于所有评测用例,1 ≤ n, m ≤ 1000 。
答案:
应该是最难的一道题了,感觉像是dp,本人太菜了没写出来QwQ。
试题 H: 破解信息
【问题描述】
在遥远的未来,星际旅行已经成为常态。宇航员小蓝在一次探险任务中,
意外发现了一个古老的太空遗迹。遗迹中存放着一个数据存储器,里面记录着
一段加密的信息。经过初步分析,小蓝发现这段信息可以被表示为一个字符串
S,而解密的关键,在于找出 S 中字典序最大的回文子序列。
• 子序列:指从原字符串中抽取若干个字符(可以不连续),按照它们在原
字符串中的相对顺序排列所形成的新序列。例如,对于字符串 "abc",其
子序列包括 "a"、"b"、"c"、"ab"、"ac"、"bc" 和 "abc"。
• 字典序:指字符串按照字典中的排序规则比较大小的方式。对于两个字符
串,从左到右逐字符比较,先出现较大字符的字符串字典序更大;若比较
到某个字符串结束仍未找到不同的字符,则较短的字符串字典序较小。例
如,"abc" < "abd",而 "ab" < "abc"。
现在,请你从字符串 S 中,找出字典序最大的回文子序列,帮助小蓝解开
这段来自星际文明的信息。
【输入格式】
输入一行包含一个字符串 S ,表示加密的信息。
【输出格式】
输出一行包含一个字符串,表示 S 中字典序最大的回文子序列。
【样例输入 1】
abcd
【样例输出 1】
d
【样例输入 2】
abab
【样例输出 2】
bb
【评测用例规模与约定】
对于 30% 的评测用例,1 ≤ |S | ≤ 300 ,其中 |S | 表示字符串 S 的长度;
对于所有评测用例,1 ≤ |S | ≤ 105 ,S 中只包含小写英文字母。
答案:
虚假的20分题目,此题只需要考虑字符串里面最大的字母的个数,然后输出这么长的该字符即可,原因请结合题目:对于两个字符串,从左到右逐字符比较,先出现较大字符的字符串字典序更大
。
cpp
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define endl '\n'
const int N = 1e5 + 10;
string s;
char ma;
int cnt = 1;
signed main() {
cin >> s;
for (auto i : s) {
if (i > ma) {
ma = i;
cnt = 1;
}
else if (i == ma) {
cnt++;
}
}
for (int i = 0; i < cnt; i++) {
cout << ma;
}
return 0;
}
如果对于以上题目有什么想法或者错误,欢迎与我积极讨论。