Codeforces Round 834 (Div. 3)

发布时间 2023-12-18 15:17:02作者: goodluckbear

Codeforces Round 834 (Div. 3)

image-20231217162412324

A. Yes-Yes?

题意:就是Y后面跟e,e后面跟s,s后面跟Y

#include <iostream>

using namespace std;

void solve() {
    string x;
    cin >> x;
    int l = x.size();
    if(l==1){
        if(x[0]!='Y'&&x[0]!='e'&&x[0]!='s'){
            cout<<"NO\n";
            return;
        }
    }
    for (int i = 0; i < l - 1; i++) {
        if (x[i] == 'Y') {
            if (x[i + 1] != 'e') {
                cout << "No\n";
                return;
            }
            continue;
        }
        if (x[i] == 'e') {
            if (x[i+1] != 's') {
                cout << "No\n";
                return;
            }
            continue;
        }
        if (x[i] == 's') {
            if (x[i+1] != 'Y') {
                cout << "No\n";
                return;
            }
            continue;
        }
        cout << "No\n";
        return;
    }
    cout << "Yes\n";
}

int main() {
    int t;
    cin >> t;
    while (t--) {
        solve();
    }
    return 0;
}

B. Lost Permutation

题意:给一段数组,添加x个数(x随便)总和一定,求是否后面可以变成一个排列

思路:拿一个来记录之前的,然后减就行

#include <bits/stdc++.h>

using namespace std;

void solve() {
    int n, x;
    vector<bool> a(n + 100, false);
    cin >> n >> x;
    int ma = 0;
    for (int i = 0; i < n; i++) {
        int b;
        cin >> b;
        ma = max(ma, b);
        a[b] = true;
    }
    for (int i = 1; i < ma; i++) {
        if (!a[i]) {
            x -= i;
        }
    }
    while (x > 0) {
        x -= ++ma;
    }
    if (x == 0) {
        cout << "YES\n";
    } else {
        cout << "NO\n";
    }
}

int main() {
    int t;
    cin >> t;
    while (t--) {
        solve();
    }
    return 0;
}

C. Thermostat

题意:最小变化是x,范围a-b

思路:很明显就是三种情况ifelse就行

#include <bits/stdc++.h>

using namespace std;

void solve() {
    int l, r, x;
    cin >> l >> r >> x;
    int a, b;
    cin >> a >> b;
    if (a == b) {
        cout << "0\n";
        return;
    }
    if (abs(a - b) >= x) {
        cout << "1\n";
        return;
    }
    int x1 = a - l, x2 = b - l, y1 = r - a, y2 = r - b;
    if ((x1 >= x && x2 >= x) || (y1 >= x && y2 >= x)) {
        cout << "2\n";
        return;
    }
    int ma1 = max(x1, y1), ma2 = max(x2, y2);
    if (ma1 >= x && ma2 >= x) {
        cout << "3\n";
        return;
    }
    cout << "-1\n";
}

int main() {
    int t;
    cin >> t;
    while (t--) {
        solve();
    }
    return 0;
}

D. Make It Round

有人当sb把mn输反了

题意:求有最多0的数

思路:相当于找10的指数次方倍,满足
$$
t/gcd(t,n) \leq m的最大值t,假设d=t/gcd(t,n),n扩大(m/d)*d倍时就是所求
$$

板子:

int gcd(int a, int b) {
    return b ? gcd(b, a % b) : a;
}
#include <bits/stdc++.h>

using namespace std;
#define int long long

int gcd(int a, int b) {
    return b ? gcd(b, a % b) : a;
}

void solve() {
    int m, n;
    cin >> n >> m;
    int t = 1;
    while (t / gcd(t, n) <= m) t *= 10;
    t /= 10;//多乘了一个
    int d = t / gcd(t, n);
    cout << n * (m / d) * d << endl;
}

signed main() {
    int t;
    cin >> t;
    while (t--) {
        solve();
    }
}

E. The Humanoid

题意:吸收一名力量严格小于人形力量的宇航员; 如果还有绿色血清,则使用绿色血清,使用蓝色血清,如果还有剩余的话。在不使用血清的情况下吸收到的就是a[i]/2,使用绿色血清就是×2蓝色血清×3

思路:就是一道dfs遍历就行(补题的时候一看如此简单在想为什么没写--当傻逼了,没读这题,D数学证明想太久了还犯了个致命错误)

#include <bits/stdc++.h>

using namespace std;
#define int long long
int a[200010];
int n;

int dfs(int st, int green, int blue, int h) {
    int res = 0;
    for (int i = st; i <= n; i++) {
        if (a[i] < h) {
            h += a[i] / 2;
            res++;
        } else {
            int ch = 0;
            if (green) {
                ch = max(ch, dfs(i, green - 1, blue, h * 2));
            }
            if (blue) {
                ch = max(ch, dfs(i, green, blue - 1, h * 3));
            }
            return ch + res;
        }
    }
    return res;
}

void solve() {
    int h;
    cin >> n >> h;
    for (int i = 1; i <= n; i++) {
        cin >> a[i];
    }
    sort(a + 1, a + n + 1);
    cout << dfs(1, 2, 1, h) << "\n";
}

signed main() {
    int t;
    cin >> t;
    while (t--) {
        solve();
    }
}