Cf #780 (Div. 3) A -- C
阿新 • • 發佈:2022-04-06
A. Vasya and Coins
題目大意
Vasya 有 a 個 1-burle coin,有 b 個 2-burle coin,問他不能通過不找錢支付的價格的最小值。
思路
如果 a 不為 0,從 1 ~ a + b * 2 中的所有價格都可以經過組合進行支付,因此最小不能支付的價格為 a + b * 2 + 1;如果 a 為 0,不論 2-burle coin 有幾個,都無法表示 1 這個價格,因此最小不能支付的價格為 1。
程式碼
#include <bits/stdc++.h> using namespace std; const int N = 5050; int main() { int t; cin >> t; while (t--) { int a, b; cin >> a >> b; if (a == 0) cout << 1 << endl; else cout << b * 2 + a + 1 << endl; } return 0; }
B. Vlad and Candies
題目大意
給定一個序列,第 i 個位置代表第 i 種糖果的數量,每次吃糖果只能吃當前數量最多的糖果,並且每次相鄰兩次只能吃不同種類的糖果,問是否能夠吃完所有糖果。
思路
考慮數量最多的糖果,第一次選擇這種糖果,第二次就需要選擇其它糖果,因此如果數量最多的這種糖果的數量比數量第二多的糖果的數量 + 1 還多,那麼第二
次只能吃數量最多的這種糖果,但又不能兩次吃相同的糖果,因此一定吃不完所有糖果。反之一定能通過這兩種糖果控制其它糖果的數量,從而吃掉所有糖果。
程式碼
#include <bits/stdc++.h> using namespace std; const int N = 5050; int main() { int t; cin >> t; while (t--) { int n; cin >> n; int s[n + 2]; int ma1 = 0, ma2 = 0; for (int i = 1; i <= n; i++) { int a; cin >> a; if (a > ma1) { ma2 = ma1; ma1 = a; } else if (a == ma1) ma2 = a; else if (a > ma2) ma2 = a; } if (n == 1) { if (ma1 == 1) cout << "YES\n"; else cout << "NO\n"; } else { if (ma1 - ma2 <= 1) cout << "YES\n"; else cout << "NO\n"; } } return 0; }
C. Get an Even String
題目大意
定義偶字串滿足 1.長度為偶數;2.對於字串中每個奇數位置 ,。(空字串也是偶字串),求給定字串最少去掉幾個字元能得到偶字串。
思路
考慮貪心,找每次第一對出現的相同字元,然後將之間的所有字元拋棄,可以發現這樣處理之後,後面剩下的字元中才更有機會找到相同字元。如 aefebfaf,從前往後掃,最先匹配到的是 e,然後拋掉 f 和開頭的 a,剩下 bfaf 再匹配到 f,拋掉 a 和開頭的 b,因此最終刪除的是 4 個字元。再看看先匹配 a 的情況,就需要刪除 6 個字元,先匹配 f 的情況也是刪除 6 個字元,然後將匹配成功一此計數器加2,總數減去計數器就可以得到答案。
程式碼
#include <bits/stdc++.h> using namespace std; const int N = 200; map<char, int> ma; int main() { int t; cin >> t; while (t--) { string s; cin >> s; int cnt = 0; for (int i = 0; i < s.size(); i++) { if (ma[s[i]] != 0) { cnt += 2; ma.clear(); } else ma[s[i]] ++; } cout << s.size() - cnt << endl; ma.clear(); } return 0; }