[codeforces] 暑期訓練之打卡題(二)
阿新 • • 發佈:2021-07-27
每個標題都做了題目原網址的超連結
Day11《Given Length and Sum of Digits...》
題意:
給定一個數 m 和 一個長度 s,計算最大和最小在 s 長度下,各位數字之和為 m 的值
如果無法生成,則輸出兩個-1
題解:
需要注意:在輸出最大值時,判一下 k 是否為 0
上板子:
#include <bits/stdc++.h> using namespace std; typedef long long ll; int main() { int len, sum; cin >> len >> sum; if (sum == 0&& len != 1 || sum > len * 9) cout << -1 << ' ' << -1 << endl; else { for (int i = len - 1, k = sum; i >= 0; --i) { int x = max(0, k - 9 * i); if (!x && i == len - 1 && k)x = 1; cout<< x; k -= x; } cout << ' '; for (int i = len - 1, k = sum; i >= 0; --i) { int x = min(9, k); cout << x; k -= x; } } return 0; }
Day12《Cheap Travel》
題意:
一個 ride 需要 a 盧布,m 個 ride 需要 b 盧布,這兩種方案都可以無限制地採用,要完成 n rides 最少需要多少盧布
注:由樣例可知,不一定要剛好完成 n rides,可以完成 cnt rides(cnt > n)
題解:
本題我採用的分類討論:
- 當 n <= m 時,一張多程票 b 就可以完成 n rides,故需要比較 a*n 和 b 的大小
- 當 n > m 時,比較 a 和 b/m 的價格(b/m 即為 m rides 中的單程價)
上板子:
#include <bits/stdc++.h> using namespace std; typedef long long ll; int main() { int n, m; double a, b; while (scanf("%d%d%lf%lf", &n, &m, &a, &b) != EOF) { int ans; if (n <= m) ans = (a * n > b ? b : a * n); else if (a >= b / m)//單程a的價格比買多程b的平均單程價格b/m高 { ans = n / m * b;//儘可能購買b ans += min(n % m * a, b); } else ans = n * a; printf("%d\n", ans); } return 0; }
Day13《BerSU Ball》
題意:
給出兩個陣列,兩個元素的差小於等於 1 時才能配對,問兩組之間進行配對,求最多對數。
題解:
暴力出奇跡
上板子:
#include <bits/stdc++.h> using namespace std; typedef long long ll; int main() { vector<int>g; vector<int>b; int n, m, i, c, j, k = 0, num = 0; cin >> n; for (i = 0;i < n;i++) { cin >> c; b.push_back(c); } cin >> m; for (i = 0;i < m;i++) { cin >> c; g.push_back(c); } sort(g.begin(), g.end()); sort(b.begin(), b.end()); for (i = 0;i < n;i++) { for (j = k;j < m;j++) { if (abs(b.at(i) - g.at(j)) <= 1) { num++; k = j + 1; break; } } } cout << num << '\n'; return 0; }