前言
這場的題目非常的簡單啊,至于為什么有第二場,因為當時河北正在刮大風被迫停止了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 。
答案:
應該沒什么好講的吧~
#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 。
答案:
數據量很少,不用想太復雜,直接暴力即可。
#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不是說明這個值需要調整。
#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。
#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分題目,此題只需要考慮字符串里面最大的字母的個數,然后輸出這么長的該字符即可,原因請結合題目:對于兩個字符串,從左到右逐字符比較,先出現較大字符的字符串字典序更大
。
#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;
}
如果對于以上題目有什么想法或者錯誤,歡迎與我積極討論。