10.19模拟赛总结

\(\text{比赛传送门}\)

\(\text{总结}\)

你说的对,但是今天 pty 说是信心场,但是我真的看不出哪里信心了。/jk

拿到了 \(\text{100 + 100 + 50 + 0 = 250pts}\)\(\text{Rk.16}\)怎么感觉在骂我),我真菜。/cf/cf/cf

我们的 @guanyf 巨佬真是太强了,拿到了 \(\text{Rk.1}\)\(\text{305pts}\))。

\(\text{Edit}\)

\(\text{题意}\)

给一个字符串 \(S\),将 \(S\) 中的数字与字母用空格隔开后输出。

\(\text{分析}\)

模拟,没啥好讲的啊。。

\(\text{寄因}\)

没寄。

\(\text{代码}\)

点击查看代码
#include <bits/stdc++.h>

using namespace std;

int l;
string s;

int main() {
  getline(cin, s);
  l = s.size();
  if (l == 0) {
    return 0;
  }
  cout << s[0];
  for (int i = 1; i < l; i++) {
    if (((s[i] >= '0' && s[i] <= '9') && ((s[i - 1] >= 'a' && s[i - 1] <= 'z') || (s[i - 1] >= 'A' && s[i - 1] <= 'Z'))) || (((s[i] >= 'a' && s[i] <= 'z') || (s[i] >= 'A' && s[i] <= 'Z')) && (s[i - 1] >= '0' && s[i - 1] <= '9'))) {
      cout << ' ';
    }
    cout << s[i];
  }
  return 0;
}

\(\text{Game}\)

\(\text{题意}\)

\(n\) 个数 \(a_1, a_2, \ldots, a_n\),A 每次可以拿走任意个数(至少 \(1\) 个),B 每次可以拿走 \(1\) 个数,定义得分为 A 拿走的数的和,A 希望得分最大,B 希望得分最小,A 先手,假设两人都按最优策略,请问得分。

\(\text{分析}\)

因为 A 先手,且 A 想要得分最大,那么 A 一定会先把所有正数拿走,然后分两种情况讨论:

  1. A 拿完所有的正数后,B 拿走所有第奇数大的负数,A 拿走所有第偶数大的负数。
  2. A 拿完所有的正数后,再拿一个最大的负数,然后 B 拿走所有第偶数大的负数,A 拿走所有第奇数大的负数。

然后两种可能取个最大值就行了。

\(\text{寄因}\)

没寄。

\(\text{代码}\)

点击查看代码
#include <bits/stdc++.h>

#define int long long

using namespace std;

constexpr int kMaxN = 1e5 + 5;

int n;
int a[kMaxN];
vector<int> l;
int sco0, sco1;

signed main() {
  ios::sync_with_stdio(0);
  cin.tie(0), cout.tie(0);
  cin >> n;
  for (int i = 1; i <= n; i++) {
    cin >> a[i];
    if (a[i] >= 0) {
      sco0 += a[i];
      sco1 += a[i];
    } else {
      l.push_back(a[i]);
    }
  }
  sort(l.begin(), l.end(), greater<int>());
  for (int i = 0; i < l.size(); i += 2) {
    sco0 += l[i];
  }
  if (n == 1) {
    sco1 = -0x7fffffff;
  } else {
    for (int i = 1; i < l.size(); i += 2) {
      sco1 += l[i];
    }
  }
  cout << max(sco0, sco1) << '\n';
  return 0;
}

\(\text{Score}\)

\(\text{题意}\)

给定 \(n\) 个元素的序列 \(a_1, \ldots, a_n\),求有多少个区间 \([l, r]\) 满足 \(\sum\limits_{i = l}^r a_i \equiv 0 \pmod{r - l + 1}\)

\(\text{分析}\)

首先,注意到数据范围里微妙的 \(a_i \le 100\),然后用你聪明的小脑瓜想一想,就会发现,平均数的取值在 \([1, 100]\) 之间,然后题目中的式子可以变式为 \(\sum\limits_{i = l}^r (a_i - v) \ge 0\),前缀和维护一下就行了。

\(\text{寄因}\)

没寄。

\(\text{代码}\)

点击查看代码
#include <bits/stdc++.h>

using namespace std;

typedef long long ll;

const int kMaxN = 1e5 + 5, kMaxA = 105;

int n, a[kMaxN], s[kMaxN], v[kMaxN * kMaxA * 2];
ll r;

signed main() {
  ios::sync_with_stdio(0);
  cin.tie(0), cout.tie(0);
  cin >> n;
  for (int i = 1; i <= n; i++) {
    cin >> a[i];
  }
  for (int i = 1; i <= 100; i++) {
    v[kMaxN * kMaxA] = 1;
    for (int j = 1; j <= n; j++) {
      s[j] = s[j - 1] + a[j] - i;
      r += v[s[j] + kMaxN * kMaxA];
      v[s[j] + kMaxN * kMaxA]++;
    }
    for (int j = 0; j <= n; j++) {
      v[s[j] + kMaxN * kMaxA] = 0;
    }
  }
  cout << r;
  return 0;
}

\(\text{City}\)

本场比赛压轴题,需要动点脑筋。

\(\text{题意}\)

\(n\) 个点,可以建 \(m\) 条边,问能不能建 \(m\) 条边使得图中恰好有 \(X\) 个强连通分量,且对于每组 \(i(1 \le i \le q)\),满足 \(a_i, b_i\) 在同一个强连通分量中。

\(\text{分析}\)

咕咕咕。

\(\text{寄因}\)

不可以,总司令,但是抱零(

毒瘤数据人。

\(\text{代码}\)

咕咕咕。

posted @ 2023-10-19 16:37  Yun_Mengxi  阅读(19)  评论(0)    收藏  举报