本文是 AtCoder Beginner Conteset(ABC)382 的总结笔记。
A - Daily Cookie Problem:A - Daily Cookie
省略。
B - Daily Cookie 2 Problem:B - Daily Cookie 2
把字符串 后面的 个@
改成 .
输出。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 #include <bits/stdc++.h> using namespace std;typedef long long LL;typedef pair<int , int > PII;void solve () { int n, k; cin >> n >> k; string s; cin >> s; for (int i = n - 1 ; i >= 0 ; i--) { if (!k) break ; if (s[i] == '@' ) { k--; s[i] = '.' ; } } cout << s << endl; } int main () { cin.tie (0 ); ios_base::sync_with_stdio (false ); solve (); return 0 ; }
C - Kaiten Sushi Problem:C - Kaiten Sushi
贪心。
题目: 有编号 的 个人,每个人有阈值 ,只吃超过阈值的食物。
有 的 份寿司,每个寿司有美味度 ,依次经过上面的每个人。只要美味度高于这个人,就会被这个人吃掉。
输出每份寿司被谁吃掉。
思路: 对于 来说,只要是高于它阈值的寿司,都会被吃掉。所以将所有寿司按照降序排列,从头开始遍历 的各个人即可。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 #include <bits/stdc++.h> using namespace std;typedef long long LL;typedef pair<int , int > PII;const int N = 2e5 + 10 ;int n, m;int A[N];PII B[N]; int res[N]; bool cmp (const PII& a, const PII& b) { return a.first > b.first; } void solve () { cin >> n >> m; for (int i = 0 ; i < n; i++) cin >> A[i]; for (int i = 0 ; i < m; i++) { cin >> B[i].first; B[i].second = i; } sort (B, B + m, cmp); memset (res, -1 , sizeof res); for (int i = 0 , index = 0 ; i < n; i++) { while (A[i] <= B[index].first) { res[B[index].second] = i + 1 ; index++; } } for (int i = 0 ; i < m; i++) cout << res[i] << endl; } int main () { cin.tie (0 ); ios_base::sync_with_stdio (false ); solve (); return 0 ; }
D - Keep Distance Problem:D - Keep Distance
DFS + 剪枝
题目: 打印长度为 并满足下面两个条件的字典序序列 :
思路: 题目中有个重要的约束条件:前一个数 与后一个数 距离相差 以上。
利用这个约束条件可以剪枝 DFS 的递归过程,大大减少时间复杂度。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 #include <bits/stdc++.h> using namespace std;typedef long long LL;typedef pair<int , int > PII;int n, m;vector<vector<int >> res; vector<int > temp; void dfs (int x, int u) { if (u == n) { res.push_back (temp); return ; } if (x > m) return ; for (int i = x + 10 ; i <= m - 10 * (n - 1 - u); i++) { temp.push_back (i); dfs (i, u + 1 ); temp.pop_back (); } } void solve () { cin >> n >> m; for (int i = 1 ; i <= m - 10 * (n - 1 ); i++) { temp.push_back (i); dfs (i, 1 ); temp.pop_back (); } cout << res.size () << endl; for (auto & x : res) { for (auto t : x) cout << t << " " ; cout << endl; } } int main () { cin.tie (0 ); ios_base::sync_with_stdio (false ); solve (); return 0 ; }
E - Expansion Packs Problem:E - Expansion Packs
概率题
题目: 有无限个口袋,每个口袋里有 张卡片。第 张卡片位稀有卡的概率为 。
一个个打开口袋。求累计获得 张稀有卡的时候,打开口袋的期望值。
限制条件:
思路: TODO