1519A. Red and Blue Beans

问题简述

给定 Educational Codeforces Round 108 (Rated for Div. 2) (A思维,Bmath,C前缀和,D枚举) - 图1 个红豆,Educational Codeforces Round 108 (Rated for Div. 2) (A思维,Bmath,C前缀和,D枚举) - 图2 个蓝豆,差值 Educational Codeforces Round 108 (Rated for Div. 2) (A思维,Bmath,C前缀和,D枚举) - 图3 ,要求我们进行为红蓝豆分组,使得红豆和蓝豆绝对值差值不大于 Educational Codeforces Round 108 (Rated for Div. 2) (A思维,Bmath,C前缀和,D枚举) - 图4 ,即:一个红豆最多与 Educational Codeforces Round 108 (Rated for Div. 2) (A思维,Bmath,C前缀和,D枚举) - 图5 个蓝豆组合,反之亦然

问题分析

设数量小的豆子为 Educational Codeforces Round 108 (Rated for Div. 2) (A思维,Bmath,C前缀和,D枚举) - 图6 ,数量多的豆子为 Educational Codeforces Round 108 (Rated for Div. 2) (A思维,Bmath,C前缀和,D枚举) - 图7 所以满足 $y \le x + x · d $ 输出 YES

代码解决

  1. using ll = long long;
  2. void solve() {
  3. ll r, b, d;
  4. cin >> r >> b >> d;
  5. if (r < b) swap(r, b);
  6. cout << (b + b * d >= r ? "YES\n" : "NO\n");
  7. }

1519B. The Cake Is a Lie

问题简述

求从Educational Codeforces Round 108 (Rated for Div. 2) (A思维,Bmath,C前缀和,D枚举) - 图8#card=math&code=%281%2C1%29&id=VJFo7) 移动至 Educational Codeforces Round 108 (Rated for Div. 2) (A思维,Bmath,C前缀和,D枚举) - 图9#card=math&code=%28n%2Cm%29&id=YkJuC) 的 Cost是否等于 Educational Codeforces Round 108 (Rated for Div. 2) (A思维,Bmath,C前缀和,D枚举) - 图10,每一步的代价:Educational Codeforces Round 108 (Rated for Div. 2) (A思维,Bmath,C前缀和,D枚举) - 图11%20%5Cto%20(x%20%2B%201%2Cy)#card=math&code=%28x%2Cy%29%20%5Cto%20%28x%20%2B%201%2Cy%29&id=SzmIE) 代价为 Educational Codeforces Round 108 (Rated for Div. 2) (A思维,Bmath,C前缀和,D枚举) - 图12 ,$(x,y) \to (x,y + 1) $ 的代价为 Educational Codeforces Round 108 (Rated for Div. 2) (A思维,Bmath,C前缀和,D枚举) - 图13

问题分析

可以通过DP或者数学的方法解决

这里贴一下暴力解法 DFS

  1. int n, m, k;
  2. ll cnt = 0;
  3. void dfs(int x, int y, int val) {
  4. if (x == n && y == m) {
  5. cnt = val;
  6. return;
  7. }
  8. if (x > n || y > m) return;
  9. if (x < n)
  10. dfs(x + 1, y, val + y);
  11. else
  12. dfs(x, y + 1, val + x);
  13. }
  14. void solve() {
  15. cnt = 0;
  16. cin >> n >> m >> k;
  17. dfs(1, 1, 0);
  18. cout << (cnt == k ? "YES\n" : "NO\n");
  19. }

math:Educational Codeforces Round 108 (Rated for Div. 2) (A思维,Bmath,C前缀和,D枚举) - 图14%20%2B%20m%20*%20(n%20-%201)#card=math&code=k%20%3D%20%28m%20-%201%29%20%2B%20m%20%2A%20%28n%20-%201%29&id=O3kI9) 输出 YES

  1. using ll = long long;
  2. void solve() {
  3. ll n, m, k;
  4. cin >> n >> m >> k;
  5. cout << (k == (m - 1) + m * (n - 1) ? "YES\n" : "NO\n");
  6. }

1519C. Berland Regional

问题简述

某地方举办XCPC区域赛, Educational Codeforces Round 108 (Rated for Div. 2) (A思维,Bmath,C前缀和,D枚举) - 图15 个学生,分别来自 Educational Codeforces Round 108 (Rated for Div. 2) (A思维,Bmath,C前缀和,D枚举) - 图16 且每人的编程能力 Educational Codeforces Round 108 (Rated for Div. 2) (A思维,Bmath,C前缀和,D枚举) - 图17 ,如果限定每个队伍必须 Educational Codeforces Round 108 (Rated for Div. 2) (A思维,Bmath,C前缀和,D枚举) - 图18 人,那么学校会安排 Educational Codeforces Round 108 (Rated for Div. 2) (A思维,Bmath,C前缀和,D枚举) - 图19 更大的人组队,并且每个学院可以派出多个队伍且保证每个队友刚好 Educational Codeforces Round 108 (Rated for Div. 2) (A思维,Bmath,C前缀和,D枚举) - 图20 人,当 Educational Codeforces Round 108 (Rated for Div. 2) (A思维,Bmath,C前缀和,D枚举) - 图21 时,求出所有学校参赛人的 Educational Codeforces Round 108 (Rated for Div. 2) (A思维,Bmath,C前缀和,D枚举) - 图22 ,当人数不够 Educational Codeforces Round 108 (Rated for Div. 2) (A思维,Bmath,C前缀和,D枚举) - 图23 时战力和为 Educational Codeforces Round 108 (Rated for Div. 2) (A思维,Bmath,C前缀和,D枚举) - 图24 .

问题分析

把每个学生存到对应的学校,并按照从大到小降序存进数组 u[] 且对每个学校的该大小位size的数组进行前缀和s[],每个学校对 Educational Codeforces Round 108 (Rated for Div. 2) (A思维,Bmath,C前缀和,D枚举) - 图25 的贡献是前 size-k%size(size/k*k) 个的前缀和

  1. using ll = long long;
  2. const int N = 2e5 + 7;
  3. set<ll> st;
  4. vector<ll> u[N];
  5. bool cmp(pair<ll, ll> a, pair<ll, ll> b) { return a.first > b.first; }
  6. void solve() {
  7. int n;
  8. cin >> n;
  9. vector<pair<ll, ll>> p(n);
  10. vector<ll> cnt(n + 2, 0);
  11. st.clear();
  12. for (int i = 0; i <= n; ++i) u[i].clear();
  13. for (int i = 0; i < n; ++i) cin >> p[i].second, st.insert(p[i].second);
  14. for (int i = 0; i < n; ++i) cin >> p[i].first;
  15. sort(p.begin(), p.end(), cmp);
  16. for (int i = 0; i < n; ++i) u[p[i].second].push_back(p[i].first);
  17. for (auto i : st) {
  18. int siz = u[i].size();
  19. for (int j = 1; j < siz; j++) u[i][j] += u[i][j - 1];
  20. for (int j = 1; j <= siz; j++) cnt[j] += u[i][siz - 1 - siz % j]; //关键是这里处理ans[]
  21. }
  22. for (int i = 1; i <= n; i++) cout << cnt[i] << " ";
  23. cout << endl;
  24. }

1519D. Maximum Sum of Products

问题简述

至多可以反转一次 a[] ,问最大的 Educational Codeforces Round 108 (Rated for Div. 2) (A思维,Bmath,C前缀和,D枚举) - 图26

问题分析

T=2s,n=5000,直接枚举所有情况,所以考虑 Educational Codeforces Round 108 (Rated for Div. 2) (A思维,Bmath,C前缀和,D枚举) - 图27 的前缀和,枚举中点,且考虑翻转的长度奇偶,把翻转的 [l,r] 和 [l-1,r+1] 的式子展开发展不同点只有Educational Codeforces Round 108 (Rated for Div. 2) (A思维,Bmath,C前缀和,D枚举) - 图28 ,左右两端用前缀和求和即可

  1. using ll = long long;
  2. ll a[5005], b[5005], s[5005], ans = 0;
  3. int n;
  4. void run1(int x) { //翻转长度位奇数
  5. ll res = 0;
  6. for (int l = x, r = x; l >= 1 && r <= n; l--, r++) {
  7. if (l == r) res += a[l] * b[l];
  8. else
  9. res += a[l] * b[r] + a[r] * b[l];
  10. ans = max(ans, res + s[l - 1] + s[n] - s[r]);
  11. }
  12. }
  13. void run2(int x) { //翻转长度位偶数
  14. ll res = 0;
  15. for (int l = x, r = x + 1; l >= 1 && r <= n; l--, r++) {
  16. if (l == r) res += a[l] * b[l];
  17. else
  18. res += a[l] * b[r] + a[r] * b[l];
  19. ans = max(ans, res + s[l - 1] + s[n] - s[r]);
  20. }
  21. }
  22. void solve() {
  23. cin >> n;
  24. for (int i = 1; i <= n; i++) cin >> a[i];
  25. for (int j = 1; j <= n; j++) cin >> b[j];
  26. for (int i = 1; i <= n; i++) s[i] = s[i - 1] + a[i] * b[i];
  27. for (int i = 1; i <= n; i++) run1(i); //翻转长度位奇数
  28. for (int i = 1; i <= n; i++) run2(i); //翻转长度位偶数
  29. ans = max(ans, s[n]); //特判一下原来不翻转
  30. cout << ans;
  31. }