Codeforces Round 899 (Div. 2)

待我称王封你为后i 2024-02-28 06:56 77阅读 0赞

Dashboard - Codeforces Round 899 (Div. 2) - Codeforces

A. Increasing Sequence

由于a与b不相等,但b必须算出最小故可以从最小开始(1),故如果b = a就将其值++,使其改变即可,其余由于b1 < b2 < b3…顺着赋值即可

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. const int N = 1e7 + 10;
  4. int b[N], a[N];
  5. void solve()
  6. {
  7. int n, cnt = 0;
  8. cin >> n;
  9. for(int i = 1; i <= n; i ++)
  10. {
  11. cin >> a[i];
  12. }
  13. int k = 1;
  14. for(int i = 1; i <= n; i ++)
  15. {
  16. if(k != a[i])
  17. {
  18. b[i] = k;
  19. k ++;
  20. }
  21. else
  22. {
  23. k ++;
  24. b[i] = k;
  25. k ++;
  26. }
  27. }
  28. cout << b[n] << '\n';
  29. }
  30. int main()
  31. {
  32. ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
  33. int t;
  34. cin >> t;
  35. while(t --)
  36. {
  37. solve();
  38. }
  39. return 0;
  40. }

B. Sets and Union

对于每一个集合,我们可以先将这些集合中的数都存放在v[i]这个数组里,每一个i代表了一个集合,再将集合中有哪些数存在set中,因为set自动排序去重,我们可以不重的在set中看到每个数的存储,我们要找到几个集合的交集使其有最大的元素,最好的方案就是在所有元素中去掉一个元素,我们可以枚举每一个元素,看它在每个集合中是否出现,将没有出现过这个元素的集合全部相加,每找一个元素就比较一个元素,找到最大的缺少这个元素的集合的数为答案(将没有这个数的集合的元素存入set(ss),set(ss)会自动去重),最大值即为答案

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. void solve()
  4. {
  5. int n, ans = 0;
  6. int s, len;
  7. vector<int> v[100];
  8. vector<int> v1;
  9. cin >> n;
  10. for(int i = 0; i < n; i ++)
  11. {
  12. cin >> len;
  13. for(int j = 0; j < len; j ++)
  14. {
  15. cin >> s;
  16. v[i].push_back(s);
  17. }
  18. }
  19. set<int>st;
  20. for(int i = 0; i < n; i ++)
  21. {
  22. for(auto j : v[i])
  23. {
  24. st.insert(j);
  25. }
  26. }
  27. for(int i : st)
  28. {
  29. set<int> ss;
  30. ss.clear();
  31. int x = i;
  32. for(int j = 0; j < n; j ++)
  33. {
  34. int flag = 1;
  35. for(auto k : v[j])
  36. {
  37. if(k == x)flag = 0;
  38. }
  39. if(flag)
  40. {
  41. for(auto o : v[j])
  42. {
  43. ss.insert(o);
  44. }
  45. }
  46. }
  47. ans = max(ans, (int)ss.size());
  48. }
  49. cout << ans << '\n';
  50. }
  51. int main()
  52. {
  53. ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
  54. int t;
  55. cin >> t;
  56. while(t --)
  57. {
  58. solve();
  59. }
  60. return 0;
  61. }

C. Card Game

题意:奇数位的a[i]进行删除并获得分数,偶数位的a[i]只用删除即可

eg.1 2 3 4 5

会发现奇数位可以算上自己以及后面的所有正整数

偶数位可以算上出自己之外的所有正整数

进行后缀和的维护即可

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. typedef long long ll;
  4. const int N = 2e5 + 10;
  5. void solve()
  6. {
  7. ll n, a[N], s[N];
  8. memset(a, 0, sizeof a);
  9. memset(s, 0, sizeof s);
  10. cin >> n;
  11. for(int i = 1; i <= n; i ++)cin >> a[i];
  12. for(int i = n; i >= 1; i --)s[i] += max(s[i + 1], s[i + 1] + a[i]);
  13. ll ans = 0;
  14. for(int i = 1; i <= n; i ++)
  15. {
  16. if(i % 2)
  17. {
  18. ans = max(ans, a[i] + s[i + 1]);
  19. }
  20. else ans = max(ans, s[i + 1]);
  21. }
  22. cout << ans << '\n';
  23. }
  24. int main()
  25. {
  26. ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
  27. int t;
  28. cin >> t;
  29. while(t --)
  30. {
  31. solve();
  32. }
  33. return 0;
  34. }

发表评论

表情:
评论列表 (有 0 条评论,77人围观)

还没有评论,来说两句吧...

相关阅读

    相关 codeforces-round375-div2

    题目链接:[codeforces round 375 div2][] A题: 读一遍题目就知道是超级水的题目,,就是给你三个坐标,求三个坐标汇集到一个点所走的路程