Codeforces Round 975 (Div 2) A - C 题解

打印 上一主题 下一主题

主题 844|帖子 844|积分 2532

A

取最大值, 取的值的数量是固定的
对长度n为偶数的数组, 一定是 n / 2
对奇数, 假如取值在奇数位, 那么是(n + 1) / 2, 取值在偶数位则是n / 2, 因此能取奇数位取奇数位
  1. #include <bits/stdc++.h>
  2. #define int long long
  3. using namespace std;
  4. const int N = 200010;
  5. int n, m, k, q, ans;
  6. int a[N], f[N][2];
  7. void solve()
  8. {
  9.         cin >> n;
  10.         int maxx = 0;
  11.         int ans = n / 2;
  12.         for (int i = 1; i <= n; i ++ )
  13.         {
  14.                 cin >> a[i];
  15.                 maxx = max(a[i], maxx);
  16.                
  17.         }
  18.        
  19.         for        (int i = 1; i <= n; i ++ )
  20.         {
  21.                 if(a[i] == maxx && i % 2 == 1)
  22.                 {
  23.                         ans = (n + 1) / 2;
  24.                 }
  25.         }
  26.        
  27.        
  28.         cout << maxx + ans << endl;
  29. }
  30. signed main()
  31. {
  32.         ios::sync_with_stdio(false);
  33.         cin.tie(0);
  34.         cout.tie(0);
  35.         int T = 1;
  36.         cin >> T;
  37.         while (T -- )
  38.         {
  39.                 solve();
  40.         }
  41. }
复制代码
B

如今我们设第i 个点左面有b个线段端点, 右面有c个线段端点
假如这个点不是端点, 那么有b * c 个点经过它
假如是的话, 有b * c + b + c个点经过它(考虑它本身与其它端点相交)
  1. #include <bits/stdc++.h>
  2. #define int long long
  3. using namespace std;
  4. const int N = 200010;
  5. int n, m, k, q, ans;
  6. int a[N], b[N], c[N];
  7. void solve()
  8. {
  9.         cin >> n >> q;
  10.        
  11.         for (int i = 1; i <= n; i ++ )
  12.         {
  13.                 cin >> a[i];
  14.         }
  15.        
  16.        
  17.         map<int, int> mp;
  18.        
  19.         for (int i = 1; i < n; i ++ )
  20.         {
  21.                 mp[i * (n - i)] += a[i + 1] - a[i] - 1;
  22. //                cout << "i : " << i << " " << i * (n - i) << " " << mp[i * (n - i)] << "\n";
  23.         }
  24.        
  25.         for        (int i = 1; i <= n; i ++ )
  26.         {
  27.                 mp[n - i + (i - 1) * (n - i + 1)] += 1;
  28.         }
  29.        
  30.         for (int i = 1; i <= q; i ++ )
  31.         {
  32.                 int k;
  33.                 cin >> k;
  34.                 cout << mp[k] << " ";
  35.         }
  36.         cout << "\n";
  37. }
  38. signed main()
  39. {
  40.         ios::sync_with_stdio(false);
  41.         cin.tie(0);
  42.         cout.tie(0);
  43.         int T = 1;
  44.         cin >> T;
  45.         while (T -- )
  46.         {
  47.                 solve();
  48.         }
  49. }
复制代码
C

这道题比较头脑
maxx 取同一种牌出现的最多的数目, sum 取总牌数
检查 i 可不可以作为一组deck的长度即可. 而检查只必要判断sum + i 是否大于maxx * i 和 (sum + i - 1) / i * i 这两者即可
这是由于假如分组, 那么至少分maxx组, 也至少分(sum + i - 1) / i 组
  1. #include <bits/stdc++.h>
  2. #define int long long
  3. using namespace std;
  4. const int N = 200010;
  5. int n, m;
  6. int a[N];
  7. void solve()
  8. {
  9.         cin >> n >> m;
  10.         int sum = 0, maxx = 0;
  11.         for(int i = 1; i <= n; i ++ )
  12.         {
  13.                 cin >> a[i];
  14.                 maxx = max(maxx, a[i]);
  15.                 sum += a[i];
  16.         }
  17.        
  18.         int ans = 1;
  19.        
  20.         for(int i = 2; i <= n; i ++ )
  21.         {
  22.                 int minn = max(maxx * i, (sum + i - 1) / i * i);
  23.                 if(minn <= sum + m)
  24.                 {
  25.                         ans = max(i, ans);
  26.                 }
  27.         }
  28.         cout << ans << "\n";
  29. }
  30. signed main()
  31. {
  32.         ios::sync_with_stdio(false);
  33.         cin.tie(0);
  34.         cout.tie(0);
  35.         int T = 1;
  36.         cin >> T;
  37.         while (T -- )
  38.         {
  39.                 solve();
  40.         }
  41. }
复制代码


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

慢吞云雾缓吐愁

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表