ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Codeforces Round #808 (Div. 2)

2022-07-18 12:00:36  阅读:172  来源: 互联网

标签:std ve int Codeforces cin -- 808 Div now


Codeforces Round #808 (Div. 2)

传送门https://codeforces.com/contest/1708

错过了,第二天vp的,只写出了AB就卡C了,竟然看不出是贪心555

A. Difference Operations

题意:给一个数组,由如下操作,问能不能使得\(a_2\) 到\(a_n\) 全为0

操作是选择一个i,使得\(a_i=a_i-a_{i-1}\) 。

:显然\(a_2\) 是\(a_1\)的倍数,才可能被剪成0,同理\(a_3 是a_2 被减过程中某个数字的倍数\)

那么意味着所有数字都得是\(a_1\)的倍数,并且中间不可以被0隔断。

#include <bits/stdc++.h>
signed main() {
    int t;
    std::cin >> t;
    while (t--) {
        int n;
        std::cin >> n;
        int a[110] = {0};
        for (int i = 1; i <= n; i++)
            std::cin >> a[i];
        int k = a[1];
        bool f = 1;
        for (int i = 2; i <= n; i++) {
            if (k == 0 && a[i] != 0 || a[i] % k != 0)
                f = 0;
            if (a[i - 1] == 0 && a[i])
                f = 0;
        }
        if (f)
            std::cout << "YES" << std::endl;
        else
            std::cout << "NO" << std::endl;
    }
}

B. Difference of GCDs

题意:构造一个长度为n的数组,满足所有数字都在区间[l,r]内。

并且所有\(gcd(i,a_i )\) 的值互不相同。i

解法:因为\(gcd(i,a_i )<=i\) 又要互不相同,那么就必须$gcd(i,a_i )==i $ 也就是说\(a_i 必须是i的倍数\) 然后就在[l,r]里随便找个倍数就行了。找不到就输出NO

#include <bits/stdc++.h>
#define int long long
const int N = 1e5 + 10;
int a[N];
signed main() {
    std::ios::sync_with_stdio(false);
    int t;
    std::cin >> t;
    while (t--) {
        int n, l, r;
        std::cin >> n >> l >> r;
        bool f = 1;
        for (int i = 1; i <= n; i++) {
            a[i] = 0;
            for (int j = (l - 1) / i * i + i; j <= r; j += i) {
                if (j >= a[i]) {
                    a[i] = j;
                    break;
                }
            }
            if (!a[i])
                f = 0;
        }
        if (!f) {
            std::cout << "NO" << std::endl;
            continue;
        } else {
            std::cout << "YES" << std::endl;
            for (int i = 1; i <= n; i++)
                std::cout << a[i] << " \n"[i == n];
        }
    }
}

C. Doremy's IQ

题意:有n天,第i天有考试i,难度为\(a_i\) 有起始智商q,当q<=0时她无法继续参加考试。

如果参加的考试\(a_i>q\)那么q--。

问如何选择哪几天考试能考的次数最多。答案以01串输出。

思路:贪心地想,掉智商肯定是越迟掉越好,如果在i天选择了掉智商的考试,那么之后也要义无反顾地考下去。于是,我们可以直接二分从哪天开始掉智商并能考完后面的全部考试的。求出i最小的方案即可输出。

#include <bits/stdc++.h>
#define int long long
const int N = 1e5 + 10;
int a[N];
int ans[N];
int n, q;
std::vector<int> ve;
bool check(int p) {
    int qq = q;
    for (int i = 1; i < p; i++) {
        if (a[i] > qq) {
            ans[i] = 0;
        } else {
            ans[i] = 1;
        }
    }
    for (int i = p; i <= n; i++) {
        ans[i] = 1;
        if (a[i] > qq)
            qq--;
    }
    return qq >= 0;
}
signed main() {
    std::ios::sync_with_stdio(false);
    int t;
    std::cin >> t;
    while (t--) {
        std::cin >> n >> q;
        for (int i = 1; i <= n; i++) {
            std::cin >> a[i];
        }
        int l = 0, r = n;
        while (l < r) {
            int m = (l + r) >> 1;
            if (check(m)) {
                r = m;
            } else
                l = m + 1;
        }
        check(l);
        for (int i = 1; i <= n; i++) {
            std::cout << ans[i];
        }
        std::cout << "\n";
    }
}

D. Difference Array

题意:给一个数组。让你把它变成它的差分数组,然后升序,继续变成差分数组...

直到最终只剩一个数字,输出这个数字。

思路:直接模拟肯定不行,但是发现,随着差分操作,一定会出现大量的0,而0和0的差分还是0,那么我们就可以直接把所有的0拿出来,每次操作减一,然后算上新生成的。其他过程就暴力模拟就好了。

#include <bits/stdc++.h>
#define int long long
const int N = 1e5 + 10;
int a[N];
signed main() {
    std::ios::sync_with_stdio(false);
    int t;
    std::cin >> t;
    while (t--) {
        int n;
        std::cin >> n;
        std::vector<int> ve[2];
        for (int i = 1; i <= n; i++) {
            std::cin >> a[i];
            ve[0].push_back(a[i]);
        }
        int now = 0;
        int cost0 = 0;
        while (ve[now].size() >= 2) {
            std::sort(ve[now].begin(), ve[now].end());
            ve[now ^ 1].clear();
            if (cost0) {
                ve[now ^ 1].push_back(ve[now][0]);
                cost0--;
            }
            for (int i = 0; i < ve[now].size() - 1; i++) {
                int k = ve[now][i + 1] - ve[now][i];
                if (k == 0) {
                    cost0++;
                } else
                    ve[now ^ 1].push_back(k);
            }
            now ^= 1;
        }
        if (ve[now].size() == 0)
            std::cout << 0 << "\n";
        else if (ve[now].size() == 1) {
            std::cout << ve[now][0] << "\n";
        } else if (cost0 >= 1) {
            std::sort(ve[now].begin(), ve[now].end());
            int k1 = ve[now][0], k2 = ve[now][1] - ve[now][0];
            std::cout << std::abs(k1 - k2) << "\n";
        } else
            std::cout << std::abs(ve[now][0] - ve[now][1]) << "\n";
    }
}

标签:std,ve,int,Codeforces,cin,--,808,Div,now
来源: https://www.cnblogs.com/wtn135687/p/16489932.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有