• Educational Codeforces Round 85 (Rated for Div. 2)(A,B,C,D)


    A. Level Statistics

    题目链接

    题目大意

    t代表测试组数,n代表游戏的数据组数,判断每一个测试数据是否合理。

    思路

    • 必须满足p[i],c[i]都是非递减的。
    • 每一个时刻满足 p[i] >= c[i]。
    • 必须有 p[i] 的变化量必须大于等于 c[i] 的变化量

    代码

    //Powered by CK 2020:04:11
    #include<bits/stdc++.h>
    using namespace std;
    const int N = 110;
    int p[N], c[N], n;
    void fun() {
        int flag = 0;
        cin >> n;
        for(int i = 0; i < n; i++) {
            cin >> p[i] >> c[i];
            if(c[i] > p[i]) flag = 1;
        }
        if(flag) {
            cout << "NO" << endl;
            return ;
        }
        for(int i = 1; i < n; i++) {
            if(p[i] < p[i - 1] || c[i] < c[i - 1] || p[i] - p[i - 1] < c[i] - c[i - 1]) {
                cout << "NO" << endl;
                return ;
            }
        }
        cout << "YES" << endl;
        return ;
    }
    int main() {
        // freopen("in.txt", "r", stdin);
        int t;
        cin >> t;
        while(t--)  fun(); 
        return 0;
    }
    

    B. Middle Class

    题目链接

    题目大意

    可以取任意多个数,使其均分,得到满足数值大于等于 (x) 的最大的个数。

    思路

    读入的时候记录大于等于 (x) 的数的个数及大于 (x) 的总和,记录差值小于 0 的数。对这些数从大到小排序,然后逐一枚举,不断的减去前面记录的总和,总和大于等于0, ans++,总和小于 0 的时候直接break输出答案

    代码

    //Powered by CK 2020:04:11
    #include<bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    const int N = 1e5 + 10;
    ll down[N], n1, n, x, ans;
    int main() {
        // freopen("in.txt", "r", stdin);
        ios::sync_with_stdio(false);
        ll t, temp;
        cin >> t;
        while(t--) {
            n1 = ans= 0;
            cin >> n >> x;
            ll sum = 0;
            for(ll i = 0; i < n; i++) {
                cin >> temp;
                temp -= x;
                if(temp >= 0) {
                    ans++;
                    sum += temp;
                }
                else    down[n1++] = -temp;
            }
            sort(down, down + n1);
            for(ll i = 0; i < n1; i++) {
                sum -= down[i];
                if(sum >= 0)    ans++;
                else    break;
            }
            cout << ans << endl;
        }
        return 0;
    }
    

    C. Circle of Monsters

    题目链接

    思路

    先得到一整个序列的 a[i] - b[(i + n) - 1 % n] 的值,然后通过枚举起点找到最小值作为答案

    代码

    //Powered by CK 2020:04:11
    #include<bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    const int N = 3e6 + 10;
    ll a[N], b[N], cost[N];
    int n;
    int main() {
        // freopen("in.txt", "r", stdin);
        int t;
        scanf("%d", &t);
        while(t--) {
            ll sum = 0;
            scanf("%d", &n);
            for(int i = 0; i < n; i++) {
                scanf("%lld %lld", &a[i], &b[i]);
                if(i)   cost[i] = max((ll)0, a[i] - b[i - 1]), sum += cost[i];
            }
            cost[0] = max((ll)0, a[0] - b[n - 1]);
            sum += cost[0];
            ll ans = sum - cost[0] + a[0];
            for(int i = 0; i < n; i++)
                ans = min(ans, sum - cost[i] + a[i]);
            printf("%lld
    ", ans);
        }
        return 0;
    }
    

    D. Minimum Euler Cycle

    思路

    找到一个完全图遍历的最小字典序中的 l ~ r 的位置。我们可以发现最小字典序显然如下

    1 2 1 3 1 4 1 5 ………… 1 (n - 1) 1 n
        2 3 2 4 2 5 ………… 2 (n - 1) 2 n
            ……………………………………………………………………
                …………………………………………………………
                    ………………………………………………
                        ……………………………………
                            …………………………
                             (n - 1) n
                                     1
    

    一共有 (n(n - 1) + 1) 个数字,最后一行比较特殊,只有一个 1
    因此我们只需要用循环来枚举这些数就行,最后一个数特殊判断处理。

    代码

    #include<bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    ll n, l, r;
    int main() {
        // freopen("in.txt", "r", stdin);
        int t;
        cin >> t;
        while(t--) {
            scanf("%lld %lld %lld", &n, &l, &r);
            ll sum = 1;
            for(ll i = 1; i <= n; i++) {
                // cout << i << endl;
                if(sum + (n - i) * 2 <= l) {
                    sum += (n - i) * 2;
                    continue;
                }
                for(ll j = i + 1; j <= n; j++) {
                    if(sum >= l && sum <= r)
                        printf("%lld ", i);
                    sum++;
                    if(sum >= l && sum <= r)
                        printf("%lld ", j);
                    sum++;
                    if(sum > r) break;
                }
                if(sum > r) break;
            }
            if(sum <= r)    printf("1 ");
            printf("
    ");
        }
        return 0;
    }
    
  • 相关阅读:
    初见线段树
    用typedef声明类型
    BZOJ 3240([Noi2013]矩阵游戏-费马小定理【矩阵推论】-%*s-快速读入)
    linux命令--sysctl
    信号量学习 & 共享内存同步
    原子操作
    共享内存学习
    HOST绑定和VIP映射
    【转载】《Unix网络编程》思维导图
    外排序 & 败者树 & 多路归并-学习
  • 原文地址:https://www.cnblogs.com/lifehappy/p/12678809.html
Copyright © 2020-2023  润新知