首页 > 其他分享 >「题解」Codeforces Round 894 (Div. 3)

「题解」Codeforces Round 894 (Div. 3)

时间:2023-10-03 12:11:45浏览次数:41  
标签:894 int 题解 ll long ans return Div scanf

A. Gift Carpet

Problem

题目

Sol & Code

签到题

#include <bits/stdc++.h>
#define N 21

typedef long long ll;

int min(int a, int b) { return a < b ? a : b; }
int max(int a, int b) { return a > b ? a : b; }

int T, n, m, a[4];
std::string s[N];

int main() {
  scanf("%d", &T);
  a[0] = 'v', a[1] = 'i', a[2] = 'k', a[3] = 'a';
  while (T--) {
    scanf("%d %d", &n, &m);
    for (int i = 1; i <= n; ++i) std::cin >> s[i];
    int cnt = 0, okay = 0;
    for (int j = 0; j < m; ++j) {
      for (int i = 1; i <= n; ++i) {
        if (s[i][j] == a[cnt]) {
          ++cnt;
          break;
        }
      }
      if (cnt == 4) { okay = 1; break; }
    }
    puts(okay ? "YES" : "NO");
  }
  return 0;
}

B. Sequence Game

Problem

题目

Sol & Code

升序直接接到答案序列后,降序先加个一在答案序列后再加入答案序列。

#include <bits/stdc++.h>
#define N 200001

typedef long long ll;

int min(int a, int b) { return a < b ? a : b; }
int max(int a, int b) { return a > b ? a : b; }

int T, n, ans[N << 1];

int main() {
  scanf("%d", &T);
  while (T--) {
    scanf("%d", &n);
    int last, cnt = 0;
    scanf("%d", &last);
    ans[++cnt] = last;
    for (int i = 2, x; i <= n; ++i) {
      scanf("%d", &x);
      if (x >= last) { ans[++cnt] = x; last = x; }
      else { ans[++cnt] = 1, ans[++cnt] = x; last = x; }
    }
    printf("%d\n", cnt);
    for (int i = 1; i <= cnt; ++i) {
      printf("%d ", ans[i]);
    }
    puts("");
  }
  return 0;
}

C. Flower City Fence

Problem

题目

Sol & Code

长度为 \(n\) 的木板会对 \(1\sim n\) 有 \(1\) 的贡献,可以差分记录贡献最后看两种摆放时候一致。

#include <bits/stdc++.h>
#define N 200518

typedef long long ll;

int min(int a, int b) { return a < b ? a : b; }
int max(int a, int b) { return a > b ? a : b; }

int T, n, a[N], ans[N];

int main() {
  scanf("%d", &T);
  while (T--) {
    scanf("%d", &n);
    for (int i = 1; i <= n; ++i) ans[i] = 0, scanf("%d", &a[i]);
    std::sort(a + 1, a + n + 1);
    if (a[n] != n) { puts("NO"); continue; }
    for (int i = 1; i <= n; ++i) {
      ++ans[1], --ans[a[i] + 1];
    }
    bool okay = true;
    for (int i = 1; i <= n; ++i) {
      ans[i] += ans[i - 1];
      if (ans[i] != a[n - i + 1]) { okay = false; break; }
    }
    if (okay) puts("YES");
    else puts("NO");
  }
  return 0;
}

D. Ice Cream Balls

Problem

题目

Sol & Code

\(n\) 种不同的球有 \(\dfrac{n(n-1)}{2}\) 种不同的组合,相同种类的球有 \(1\) 种组合,计算出不超出题目要求的最大的 \(n\) 最后加上剩余数量即可。

#include <bits/stdc++.h>

typedef long long ll;

int min(int a, int b) { return a < b ? a : b; }
int max(int a, int b) { return a > b ? a : b; }

ll n;
int T;

int main() {
  scanf("%d", &T);
  while (T--) {
    scanf("%lld", &n);
    ll k = sqrt(2ll * n);
    while (k * (k - 1) <= 2ll * n) ++k;
    while (k * (k - 1) > 2ll * n) --k;
    printf("%lld\n", k + (n - k * (k - 1) / 2));
  }
  return 0;
}

E. Kolya and Movie Theatre

Problem

题目

Sol & Code

假设我们在 \(a,b,c\) 三天去看电影,那么 \(d\) 的贡献为 \(-(a-0)d-(b-a)d-(c-b)d = -cd\) 可见 \(d\) 的贡献只与最后是在哪天看的电影有关。

枚举这个最后一天 \(x\),想要知道最后一天为 \(x\) 的答案还要统计前 \(x - 1\) 个数中最多选 \(m - 1\) 个数的和的最大值,优先队列可做。

#include <bits/stdc++.h>

typedef long long ll;
ll max(ll a, ll b) { return a > b ? a : b; }

int T, n, m, d;
std::priority_queue<int> q;

int main() {
  scanf("%d", &T);
  while (T--) {
    scanf("%d %d %d", &n, &m, &d);
    ll ans = 0, res = 0;
    for (int i = 1, x; i <= n; ++i) {
      scanf("%d", &x);
      if (x > 0) {
        if (q.size() < m) {
          q.push(-x);
          res += x;
        } else {
          if (-q.top() < x) {
            res += q.top();
            q.pop();
            res += x;
            q.push(-x);
          }
        }
        ans = max(ans, res - 1ll * i * d);
      }
    }
    printf("%lld\n", ans);
    while (!q.empty()) q.pop();
  }
  return 0;
}

F. Magic Will Save the World

Problem

题目

Sol & Code

发现时间越久成功概率越大即有单调性,二分答案。

问题来到了如何判断是否可行。

问题可以转化为有两个背包,容量分别为 \(a,b\) 能否将物品全部装下,因此每个背包要尽量装,计算一次 \(0-1\) 背包看剩下的物品能否用另一个背包装下即可。

复杂度好像有点悬,加个小优化。

#include <bits/stdc++.h>
#define N 101

typedef long long ll;

int min(int a, int b) { return a < b ? a : b; }
int max(int a, int b) { return a > b ? a : b; }

int g[1000518];
int T, n, w, f, s[N], pre[N];

bool check(int k) {
  ll a = 1ll * k * w, b = 1ll * k * f;
  for (int i = 0; i <= n; ++i) {
    if (pre[i] <= a && pre[n] - pre[i] <= b) return true;
    if (pre[i] > a) break;
  }
  for (int i = a; i >= 0; --i) g[i] = 0;
  for (int i = 1; i <= n; ++i) {
    for (int j = a; j >= s[i]; --j) {
      g[j] = max(g[j], g[j - s[i]] + s[i]);
    }
  }
  return (pre[n] - g[a] <= b);
}

int main() {
  scanf("%d", &T);
  while (T--) {
    scanf("%d %d", &w, &f);
    scanf("%d", &n);
    for (int i = 1; i <= n; ++i) {
      scanf("%d", &s[i]);
      pre[i] = pre[i - 1] + s[i];
    }
    int l = 1, r = 1000000;
    while (l <= r) {
      int mid = (l + r) >> 1;
      if (check(mid)) r = mid - 1;
      else l = mid + 1;
    }
    printf("%d\n", r + 1);
  }
  return 0;
}

标签:894,int,题解,ll,long,ans,return,Div,scanf
From: https://www.cnblogs.com/poi-bolg-poi/p/17740951.html

相关文章

  • T2回家(home)题解
    T2回家(home)现在啥也不是了,虽然会了逆元,但是对期望概率题还是一窍不通,赛时相当于只推出了\(n=1\)的情况,结果运用到所有情况,理所应当只有20分。题目描述小Z是个路痴。有一天小Z迷路了,此时小Z到家有NN个单位长度。小Z可以进行若干次行动,每次行动小Z有\(\frac12\)的概率向......
  • [ARC035B] アットコーダー王国のコンテスト事情 题解
    前置芝士排列组合分析明显的贪心,第一问与此题思路相似,优先选择做时间少的,可以尽可能让后面的罚时尽量的小。难点在第二问,第二问问的是有几种可能性,有个显然的结论:相同做题时间的题目,位置调换答案仍然相同。那么可以用桶+排列组合来解决:用桶储存这个做题时间的出现次数\(b......
  • AT_abc321_f 题解
    #思路简单动态规划,$dp_i$指当前操作后取和为$i$的球的方案数,每次输出$dp_K$即可。需要注意的是对于每次`+x`操作,计算$dp$数组时要倒着循环。时间复杂度:$O(QK)$。#代码```cpp#include<bits/stdc++.h>usingnamespacestd;longlongdp[5010];intmain(){ longlon......
  • RDP远程登录后全屏,本地的任务栏始终显示的问题解决
    文章目录问题解决参考问题RDP远程登录后全屏,本地的任务栏(TaskBar)始终在下面,遮住了远程桌面的最下面,进行了解决。解决BestsolutionhowtohidelocalTaskbarwhenRDPtoaremotedesktopLaunchTaskManagerRight-click“WindowsExplorer”Select“Restart”Itworkson......
  • CodeForces-1276#B 题解
    正文这是样例1第1组数据的图。让我们观察一下,路径1->6、1->7、2->6、2->7是可行的,所以答案为4。上述路径中好像点4没有贡献?再看看样例1第2组数据的图。发现点1和点4相互之间存在其他路径,无需经过点\(a\)和点\(b\)。综上,我们可以知道:在\(a\)和\(b\)......
  • AT_abc279_g [ABC279G] At Most 2 Colors 题解
    题解\(dp[i]\)表示长度为i的格子的合法涂色数,考虑第\(i\)个怎么放第\(i\)个前面\(k-1\)个位置有2种颜色,则第\(i\)个位置只能放这两种颜色中的一种用合法方案减只有一种的方法,即得两种颜色的方案数而只有一种颜色的方案数,等于\(f[i-k+1]\),此时,让中间的\(k-2\)个......
  • P4839 P 哥的桶 题解
    题目大意有\(n\)个桶,\(m\)次操作。在\(pos\)桶中加入一个\(val\)值,求\([l,r]\)中选任意个桶使得异或和最大,求最大的异或和,注意每个节点是一个桶可以放多个值\(n,m≤5×104\)。题目思路单点修改,区间查询,异或最大值很显然是线段树维护线性基然后这样的复杂度是......
  • CF906C题解
    可能更好的阅读体验大家好,我和DP有仇,所以我用猜结论的方法过了这道题。可能是这道题的一个全新思路,可能人自闭久了什么都能想出来(((upd:好像这也是官方题解思路,看来大家做题不太喜欢看CF官方题解(((首先考虑一个问题:如果这是一道构造题,怎么构造一组合法的解?在草稿纸上画了很久......
  • Codeforces Round 730 (Div. 2) B. Customising the Track
    有\(n\)条高速公路,第\(i\)条告诉公路上的车流为\(a_i\)。现在可以执行以下操作任意次:将第\(i\)条高速公路上的一辆车移到第\(j\)条高速公路。需要求最小的\(\sum_{i=1}^{n}\sum_{j=i+1}^{n}|a_i-a_j|\)。不难发现可以构造\(\foralli,j,a_i=a_j\)使任......
  • P2230 Tinux系统 题解
    传送门题目大意:一个\(n\)个叶子节点,一个节点最多可以有\(k\)条边连向子节点,每个节点\(i\)有一个权值\(P_{i}\)。记每个节点子树内点的个数(不包括它自己)为\(son_{i}\),那么每个节点对答案的贡献就是\(son_{i}^2\timesP_{i}\)。特别的,根节点贡献为\(0\),求总贡献。两......