「Codeforces Round 499 (Div. 2)」A - F

版权声明:禁止商业用途,如需转载请注明原文出处:https://hyp1231.github.io 或者 https://blog.csdn.net/hyp1231/article/details/81263258

建议访问原文出处,获得更佳浏览体验。
原文出处:https://hyp1231.github.io/2018/07/28/20180728-cfround499div2/

A. Stages

题意

给一个长度为 n 的字符串,让你从中选出 k 个字母从小到大排成一列。要求相邻字母的 a s c i i 码之差不小于 2 。且这 k 个字母的 a s c i i 码之和最小。如果找不出这样的 k 个字母,输出 1

链接

Codeforces 1011A

题解

贪心地优先选择满足题意 a s c i i 码最小的字母。
先排序,然后做 k 次选取。每次选出最小的字母,然后删掉原字符串中,与这个字母之差小于 2 的字母。
如果不能做 k 次选取,则输出 1

代码

#include <cstdio>
#include <algorithm>
#include <queue>

const int N = 64;

int n, k;
char s[N];

int main() {
    scanf("%d%d%s", &n ,&k, s);
    std::sort(s, s + n);

    std::queue<char> que;
    for (int i = 0; i < n; ++i) que.push(s[i]);
    int cnt = 0, ans = 0;
    while (cnt < k && !que.empty()) {
        char c = que.front(); que.pop();
        ans += c - 'a' + 1;
        ++cnt;
        while (!que.empty() && que.front() - c < 2) que.pop();
            // 删除原串中与被选字母之差小于 2 的字母
    }
    printf("%d\n", cnt == k ? ans : -1);
            // 若没有完成 k 次选取,输出 -1

    return 0;
}

B. Planning The Expedition

题意

n 个宇航员, m 份粮食,第 i 份粮食的种类为 a i 。每个宇航员每天吃一份粮食,且旅程中这个宇航员只能吃一种粮食。不同的宇航员吃的粮食种类可以不同。求旅程最多满足几天的口粮。

链接

Codeforces 1011B

题解

数据规模较小,因此可以枚举天数 d
记第 i 种口粮有 c n t i 份,则在旅程中这种口粮可供 c n t i d 个宇航员食用(注意是整数除法)。
因此可以养活的宇航员的最大数目为 i c n t i d ,判断这个数目与 n 的大小关系即可。
输出满足条件的最大的 d

代码

#include <iostream>

const int N = 128;

int n, m, a[N], cnt[N]; // cnt[i]: 第 i 种口粮的份数

int main() {
    std::ios::sync_with_stdio(false), std::cin.tie(0), std::cout.tie(0);

    std::cin >> n >> m;
    for (int i = 0; i < m; ++i) {
        std::cin >> a[i];
        ++cnt[a[i]];
    }

    for (int i = m / n; i > 0; --i) {   // 口粮最多供应 m / n 天
        int sum = 0;
        for (int j = 1; j <= 100; ++j) {
            sum += cnt[j] / i;
        }
        if (sum >= n) {
            std::cout << i << std::endl;// 满足条件,输出这个最大天数
            return 0;
        }
    }
    std::cout << 0 << std::endl;        // 没有满足条件的天数,输出 0

    return 0;
}

C. Fly

题意

n 个行星,标号 1 n 。飞行器从 1 出发,经过 2 , 3 , , n 1 到达 n ,再从 n 出发到达 1
飞行器重 m 吨,且其携带的燃油也有重量。每次飞行器从行星 i 起飞,每消耗 1 吨燃油可以支持 a i 的重量;每次飞行器降落在行星 i ,每消耗 1 吨燃油可以支持 b i 的重量。只有飞行器拥有可以支撑当前总重量(飞行器重量 + 当前燃油重量)的燃油时,才可以成功起飞或降落。可以认为起飞和降落瞬间完成。
求旅程开始时携带燃油的最小吨数。

链接

Codeforces 1010A

题解

详见 「Codeforces 1010A」Fly - 二分答案

D. Rocket

题意

交互式题目,通过和机器的沟通猜一个正整数 x   ( x m )
每次你询问一个正整数 y   ( y m ) ,机器理应返回的正确答案为 { 1 x < y 0 x = y 1 x > y
但是机器有些故障,他有时返回和正确答案互为相反数的结果,这个规律通过长度为 n 的数列 p 描述。数列 p 的每一项是 1 或者是 0 。对于第 k 次询问,如果数列的第 ( k 1 ) ( mod n ) + 1 项是 0 ,则返回相反的答案;否则返回正确答案。
现在你可以给出最多 60 次询问,根据机器返回的值确定这个要猜测的数字 x

链接

Codeforces 1010B

题解

详见 「Codeforces 1010B」Rocket - 交互式 + 二分

E. Border

题意

给出钞票面额的种类数 n ,第 i 种钞票的面额为 a i 。这 n 种面额的钞票你均有无限张。现在让你求出,对这些钞票进行任意组合,得到总金额的 k 进制表示后,有可能的个位数字。

链接

Codeforces 1010C

题解

详见 「Codeforces 1010C」Border - 群论

F. Mars rover

题意

给出一个以 1 为根的有 n 个节点的树,树的每个节点表示一个输入,或者一个逻辑关系。每个逻辑关系根据儿子节点的值,套入逻辑关系式,计算出当前节点的值。
现在让你求出,只改变任一个输入节点的值,根节点的取值。

链接

Codeforces 1010D

题解

详见 「Codeforces 1010D」Mars rover - dfs

猜你喜欢

转载自blog.csdn.net/hyp1231/article/details/81263258