Educational Codeforces Round 104 (Rated for Div. 2)

Educational Codeforces Round 104 (Rated for Div. 2)

A. Arena

题意: n个英雄,每个英雄有一个权值,权值大的能够赢权值小的,只要一个英雄能够赢一场,那么这个英雄就可以当赢家,问有多少个英雄不能当赢家。

题解: 思维。只需要找到最小的这批人,这些人永远不可能赢,对着他们揉就行。

代码:

#include <bits/stdc++.h>

#define int long long
using namespace std;

int const MAXN = 2e5 + 10;
int n, m, T;
map<int, int> mp;
signed main() {
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    cin >> T;
    while (T--) {
        cin >> n;
        mp.clear();
        int mi = 110;
        for (int i = 0; i < n; i++) {
            int x;
            cin >> x;
            mp[x]++;
            mi = min(mi, x);
        }
        cout << n - mp[mi] << endl;
        }
    return 0;
}

B. Cat Cycle

题意: 有两只猫,猫A从n->1走,猫B从1->n走,如果1~n是个首尾相接的环,如果相遇地话,猫A地优先级更高,现在问时间k是猫B会再哪?

题解: 分类讨论+思维。

分奇偶性讨论。

  1. 如果为偶数,那么两只猫永远不会相遇,那么只需要直接取模
  2. 如果为奇数,那么每n/2次就会相遇,因此只需要计算相遇多少次,然后加上再取模即可。

代码:

#include <bits/stdc++.h>
using namespace std;
#define int long long
signed main() {
    int T;
    scanf("%lld", &T);
    for (int i = 0; i < T; i++) {
        int n, k;
        scanf("%lld %lld", &n, &k);
        k--;
        int ans;
        int d = n / 2;
        if (n % 2)
            ans = ((d + 1) * k / d) % n + 1;
        else
            ans = k % n + 1;

        printf("%lld\n", ans);
    }
    return 0;
}

C. Minimum Ties

题意: 有n个球队踢球,任意2个球队会进行一场比赛,要不然赢要不然输,如果比赛有输赢,那么赢的得3分,输的不得分;如果比赛是平均,那么输赢各得1分。现在要让每个队伍最后得分一样,且平局数目最少。问如果安排比赛,打印其方案?

题解: 构造。要让所有队伍得分一样,且平局数目最少,那么就要每个队伍输赢尽可能一样,然后不能安排的就平局。如果n为奇数,那么一个队伍就可以赢n/2场,输n/2场;如果n为偶数,那么一个队伍就可以赢(n-1)/2场,输(n-1)/2场,剩下一场平局。

代码:

#include <bits/stdc++.h>

using namespace std;

const int N = 1e6 + 5;
typedef long long LL;
int t;
int main() {
    cin >> t;
    while (t--) {
        int n;
        cin >> n;
        if (n % 2 == 0) {
            for (int i = 1; i <= n - 1; i++) {
                for (int j = i + 1; j < min(n+1, i + (n / 2)); j++) {
                    cout << 1 << ' ';
                }
                if (i <= (n) / 2) {
                    cout << 0 << ' ';
                    for (int j = min(n, i + (n / 2)) + 1; j <= n; j++) {
                        cout << "-1" << ' ';
                    }
                }
            }
        }
        else{
            for (int i = 1; i <= n - 1; i++) {
                for (int j = i + 1; j <= min(n, i + (n / 2)); j++) {
                    cout << 1 << ' ';
                }
                if (i <= (n) / 2+1) {
                    for (int j = min(n, i + (n / 2)) + 1; j <= n; j++) {
                        cout << "-1" << ' ';
                    }
                }
            }
        }
        cout << endl;
    }
    return 0;
}

D. Pythagorean Triples

题意: 给定一个n,要求找到满足 1 < = a < = b < = c < = n 1<=a<=b<=c<=n 1<=a<=b<=c<=n a 2 = b + c a^2=b+c a2=b+c a 2 + b 2 = c 2 a^2+b^2=c^2 a2+b2=c2的数目。 1 < = n < = 1 0 9 1<=n<=10^9 1<=n<=109

题解: 因为 b 、 c < = 1 0 9 b、c<=10^9 bc<=109,所以 a 2 < = 1 0 9 a^2<=10^9 a2<=109,那么 a < = s q r t ( 1 0 9 ) a<=sqrt(10^9) a<=sqrt(109)。将 c = a 2 − b c=a^2-b c=a2b代入 a 2 + b 2 = c 2 a^2+b^2=c^2 a2+b2=c2,得到 a 2 ∗ ( a 2 − 2 b − 1 ) = 0 a^2*(a^2-2b-1)=0 a2(a22b1)=0,则 a 2 − 2 b − 1 = 0 a^2-2b-1=0 a22b1=0。因此,可以枚举a,然后判断是否为奇数,然后求出对应的b和c,判断是否小于等于n即可。

代码:

#include <bits/stdc++.h>

#define int long long
using namespace std;

inline int read() {
    int s = 0, w = 1;
    char ch = getchar();
    while (ch < '0' || ch > '9') {
        if (ch == '-') w = -1;
        ch = getchar();
    }
    while (ch >= '0' && ch <= '9') s = s * 10 + ch - '0', ch = getchar();
    return s * w;
}

int const MAXN = (int)sqrt(2e9) + 1;
int n, m, T;

signed main() {
    T = read();
    while (T--) {
        n = read();
        int ans = 0;
        for (int a = 1; a <= min(n, MAXN); a++) {
            int a2 = a * a;
            int b = (a2 - 1) / 2;
            int c = a2 - b;
            if (a2 % 2 && b <= n && c <= n && a <= b && b <= c) ans++;
        }
        // cout << "ans:";
        // cout << ans << endl;
        printf("%lld\n", ans);
    }
    return 0;
}

E. Cheap Dinner

题意: 合格的晚餐由四道菜组成,分别是第一道菜、第二道菜、饮品、甜品。每道菜分别有 a i 、 b i 、 c i 、 d i a_i、b_i、c_i、d_i aibicidi种菜品可以选择,且知道它们分别的价格。相邻两种菜可能存在互斥关系,即不能同时上桌。给出四道菜分别有多少菜品可选以及它们的价格、互斥关系,求最少用多少钱可以构出一桌晚餐。

题解: 数据结构+dp。

代码:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值