zoukankan      html  css  js  c++  java
  • Virtual Participation CF1480 (div. 2)

    ( ext{A}) : 两个人轮番从前往后替换字符串中的字符,(x) 要字典序最小,(y) 要字典序最大,(x) 先手,并且修改后的字符不能和原来的字符一样。求最后生成的字符串。

    显然题。字典序最小就是 (a),字典序最大就是 (z)
    如果本身就是 (a) 就变成 (b),如果本来就是 (z) 就变成 (y)

    #include <bits/stdc++.h>
    using namespace std;
    
    int t; char ch[100];
    
    int main() {
      cin >> t;
      while (t--) {
        cin >> ch + 1;
        int n = strlen(ch + 1);
        for (int i = 1; i <= n; ++i) {
          if (i&1) {
            if (ch[i] == 'a') ch[i] = 'b';
            else ch[i] = 'a';
          } else {
            if (ch[i] == 'z') ch[i] = 'y';
            else ch[i] = 'z';
          }
        }
        cout << ch+1 << endl;
      }
      return 0;
    }
    

    ( ext{B}) : 一个人打怪兽,攻击力为 (A),血量为 (B)(n) 只怪兽攻击力为 (x_i),血量为 (y_i),每一回合可以挑怪兽打,双方血量扣掉对方攻击力,判断这个人最后能不能打死所有怪兽。

    显然题,特判一下 (i<n)(n) 的情况分别处理即可。
    我不会告诉你我因为没有开 LL 一直 WA。

    #include <bits/stdc++.h>
    #define int long long
    using namespace std;
     
    const int N = 1e5 + 10;
    int t, A, B, n;
    struct sb{ int a, b; } x[N];
    bool cmp(sb x, sb y) { return x.a<y.a||(x.a==y.a&&x.b<y.b); }
     
    inline void solve() {
      scanf("%lld%lld%lld", &A, &B, &n);
      for (int i = 1; i <= n; ++i) scanf("%lld", &x[i].a);
      for (int i = 1; i <= n; ++i) scanf("%lld", &x[i].b);
      sort(x+1, x+1+n, cmp);
      for (int i = 1; i <= n; ++i) {
        int ok = (x[i].b % A == 0)? x[i].b/A : x[i].b/A+1;
        B -= ok * x[i].a;
        if (i<n && B<=0) return (void)puts("NO");
        if (i==n && B+x[i].a<=0) return (void)puts("NO");
      }
      puts("YES");
    }
     
    signed main() {
      scanf("%lld", &t);
      while (t--) solve();
      return 0;
    }
    

    ( ext{C}) : 给一个排列要你猜,你询问不超过 (100) 次,求任意一个位置使得 (a_{i-1}>a_i<a_{i+1})

    也是显然题(吧)。直接二分就可以了啊,每一次询问 mid 和它左右两个位置的值。
    然后往更可能有这样关系的方向走就好了,就是哪边不满足走哪边。

    #include <bits/stdc++.h>
    using namespace std;
    
    void ask(int x) { cout << "? " << x << endl; }
    void print(int x) { cout << "! " << x << endl; }
    
    int main() {
      int n; cin >> n;
      int l = 1, r = n;
      while (l <= r) {
        int mid = (l + r) >> 1; ask(mid);
        int L, R, Mid; cin >> Mid;
        if (mid != 1) ask(mid-1), cin >> L; else L = 1919810;
        if (mid != n) ask(mid+1), cin >> R; else R = 1919810;
        if (Mid<L && Mid<R) return print(mid), 0;
        if (L < R) r = mid - 1; else l = mid + 1;
      }
    }
    

    ( ext{D1}) : 要你划分一个序列成两个集合,每个集合将连续相同段合并,求最终集合大小最大和。
    显然是个贪心,每一次记录一下上一次选择的颜色然后分情况讨论即可。
    这里为了方便正难则反了,用总数减掉合并了的个数。

    #include <bits/stdc++.h>
    using namespace std;
    
    const int N = 1e5 + 10;
    int n, res, a[N];
    
    int main() {
      ios::sync_with_stdio(false);
      cin.tie(0), cout.tie(0);
      cin >> n; int lastx = 0, lasty = 0;
      for (int i = 1; i <= n; ++i) cin >> a[i];
      for (int i = 1; i <= n; ++i) {
        if (a[i] == lastx)
          { if (a[i] == lasty) ++res; else lasty = a[i]; continue; }
        else if (lastx != lasty && lasty != a[i]) lasty = 0;
        lastx = a[i];
      }
      cout << n - res << endl;
      return 0;
    }
    

    ( ext{D2}) : 是 ( ext{D1}) 变成求最小值的题目。
    其实也很显然,只需要继续记录上一次的颜色,最开始类似离散化一下处理即可。

    #include <bits/stdc++.h>
    using namespace std;
    
    const int N = 1e5 + 10;
    int n, res, idx, idy;
    int a[N], siz[N], val[N];
    
    int main() {
      ios::sync_with_stdio(false);
      cin.tie(0), cout.tie(0);
      cin >> n;
      for (int i = 1; i <= n; ++i) cin >> a[i];
      for (int i = n; i >= 0; --i) {
        if (val[a[i]]) siz[i] = val[a[i]];
        else siz[i] = 1919810; val[a[i]] = i;
      }
      for (int i = 1; i <= n; ++i) {
        if (a[idx] == a[i]) idx = i;
        else if (a[idy] == a[i]) idy = i;
        else if (siz[idx] > siz[idy]) ++res, idx = i;
        else ++res, idy = i;
      }
      cout << res << endl;
      return 0;
    }
    
  • 相关阅读:
    ASP.NET中几种加密方法
    Linux Mint17.1安装PHPStorm8.0.2
    HTTP 错误 500.23
    Kali Linux 下安装配置MongoDB数据库 ubuntu 下安装配置MongoDB源码安装数据库
    如何在Ubuntu 18.04 LTS上安装和配置MongoDB
    scrapy 如何链接有密码的redis scrapy-redis 设置redis 密码 scrapy-redis如何为redis配置密码
    Redis报错:DENIED Redis is running in protected mode
    ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2 "No such file or directory")
    用mingw32编译ffmpeg2.7
    VS2005编译QT4.8.2
  • 原文地址:https://www.cnblogs.com/lbn233/p/VP-CF1480.html
Copyright © 2011-2022 走看看