Codeforces Round #786 (Div. 3) A—D

Codeforces Round #786 (Div. 3)

https://codeforces.com/contest/1674

A Number Transformation

直接贪,一个取1,另一个取y / x


#include <bits/stdc++.h>

using namespace std;


int main () {
    int t;
    cin >> t;
    while (t --) {
        int x, y;
        cin >> x >> y;
        if (x > y || (y % x)) {
            cout << 0 << ' ' << 0 << endl;
            continue;
        }

        if (x == y) {
            cout << 1 << ' ' << 1 << endl;
            continue;
        }

        cout << 1  << ' ' << y / x << endl;
    }
}

B Dictionary

直接去看字母顺序,注意的是中间类似"bb","cc"...等两串相同的会直接跳过,所以碰到的时候idx要记得-1
(我真是太暴力了)

#include <bits/stdc++.h>

using namespace std;


int main () {
    int t;
    cin >> t;
    while (t --) {
        string s;
        cin >> s;
        int ans = (s[0] - 'a') * 26 + (s[1] - 'a') ;
        if (s > "bb")
            ans --;
        if (s > "cc")
            ans --;
        if (s > "dd")
            ans --;
        if (s > "ee")
            ans --;
        if (s > "ff")
            ans --;
        if (s > "gg")
            ans --;
        if (s > "hh")
            ans --;
        if (s > "ii")
            ans --;
        if (s > "jj")
            ans --;
        if (s > "kk")
            ans --;
        if (s > "ll")
            ans --;
        if (s > "mm")
            ans --;
        if (s > "nn")
            ans --;
        if (s > "oo")
            ans --;
        if (s > "pp")
            ans --;
        if (s > "qq")
            ans --;
        if (s > "rr")
            ans --;
        if (s > "ss")
            ans --;
        if (s > "tt")
            ans --;
        if (s > "uu")
            ans --;
        if (s > "vv")
            ans --;
        if (s > "ww")
            ans --;
        if (s > "xx")
            ans --;
        if (s > "yy")
            ans --;
        cout << ans << endl;
    }
}

C Infinite Replacement

  1. 无穷种可能:t有a且非全a ,就可以一直替换,无限套娃
  2. 一种可能:t=="a",放在哪里都一样
  3. 其余:\(2^{s.size()}\) (可根据集合的性质得出)
#include <bits/stdc++.h>

using namespace std;

int main () {
    int _;
    cin >> _;
    while (_ --) {
        string s, t;
        cin >> s >> t;
        if (t == "a") {
            cout << 1 << endl;
            continue;
        }
        
        int cnta = 0;
        for (int i = 0; i < t.size(); i ++) 
            if (t[i] == 'a') {
                cnta ++;
                break;
            }
        

        //t有a且非全a 无穷
        if (cnta) {
            cout << -1 << endl;
            continue;
        }

        //cout << (long long)pow(2, s.size()) << endl;
        cout << (1LL << s.size()) << endl;
    }
}
//

D A-B-C Sort

如图,把交换的过程具象化,之后可以发现:

  1. 以两个块为整体来看,本质是一个换过去又换回来的过程,所以只需要考虑内部的变化,即当n−i为偶数的时候,可以交换ai和ai+1
  2. 当出现一个落单的块(即长度为奇数)时,它最终是无法改变自身位置的,所以就直接不管他了
    最后直接check一下是否有序就ok啦~

(感谢szr大佬的图)

#include <bits/stdc++.h>

using namespace std;

bool solve () {
    int n;
    cin >> n;
    vector <int> v(n);
        
    for (int i = 0; i < n; i ++)
        cin >> v[i];
    if (n <= 2) //长度为2的时候一定可以实现
        return true;

    for (int i = n - 2; i >= 0; i -= 2)
        if (v[i] > v[i + 1])
            swap (v[i], v[i + 1]);
    
    if (is_sorted (v.begin(), v.end ()))
        return true;
    return false;
}

int main () {
    int t;
    cin >> t;
    while (t --) {
        
        if (solve ())
            cout << "YES" << endl;
        else
            cout << "NO" << endl; 
        
    }
}
//当n−i为偶数的时候,可以交换ai和ai+1。

后面的题如果搞懂了就补补

posted @ 2022-05-03 10:52  Sakana~  阅读(70)  评论(0编辑  收藏  举报