武汉工程大学第三届ACM程序设计新生赛(多校联赛)2020/11/21题解报告

本题解按本人出题顺序排列

传送门

A 如何才能防AK

题目描述

A K AK AK, A l l All All- K i l l e d Killed Killed的缩写,指在比赛中解出了所有的题目。通常在 A C M ACM ACM比赛中出题人会出 1 1 1~ 2 2 2道非常难的题目来防止有人 A K AK AK,以体现出出题人的水平高超,这些题目被称为“防 A K AK AK题”。
此次的新生赛中kcxz是出题者的一员,kcxz知道这次比赛会有大佬参赛,所以如何出防 A K AK AK题成为了令kcxz头痛的事。现在kcxz对过题数目进行一个简单的模拟,请你根据每个选手的过题数来判断kcxz的出题水平。

输入描述

本题输入第一行包含一个整数 T ( 5 ≤ T ≤ 200 ) T(5\le T\le 200) T(5T200),表示参赛的人数。
接下来 T 行,每行一个整数 N ( 0 ≤ N ≤ 10 ) N(0\le N \le 10) N(0N10),表示参赛者的过题数。

输出描述

如果没有一个参赛者过了10题,则输出"666"(不含引号,下同)。如果有1~5个参赛者过了10题,则输出"good"。如果有超过6个(包含6个)参赛者过了10题,则输出"just so so"。

input
5
5
8
1
10
4
output
good

思路

签到题

Accepted code

/*
 * @Autor: CofDoria
 * @Date: 2020-11-21 12:52:37
 * @LastEditTime: 2020-11-21 13:02:34
 */
#include <bits/stdc++.h>
using namespace std;

#define db double
#define ll long long
#define inf 0x3f3f3f3f
#define s(a, n) memset(a, n, sizeof(a))
#define debug(a) cout << '#' << a << '#' << endl
#define rep(l, a, b) for (register ll l = a; l < b; ++l)
#define per(l, a, b) for (register ll l = a; l >= b; --l)
#define _ios ios::sync_with_stdio(false), cin.tie(0), cout.tie(0)
#define _forit(i, c) \
    for (__typeof__((c).begin()) i = (c).begin(); i != (c).end(); ++i)

bool fi = true;
const unsigned long long MOD = 1e9 + 7;

inline ll gcd(ll a, ll b) {
    return (b == 0 ? a : gcd(b, a % b)); }

int t;
int a;
int ans = 0;

int main() {
   
    // freopen("in.txt", "r", stdin);
    // freopen("out.txt", "w", stdout);
    scanf("%d", &t);
    for (int i = 0; i < t; i++) {
   
        scanf("%d", &a);
        if (a >= 10) ans++;
    }
    if (ans >= 6)
        printf("just so so");
    else if (ans == 0)
        printf("666");
    else
        printf("good");
    // fclose(stdin);
    // fclose(stdout);
    return 0;
}

F 交际圈差距

题目描述

在人际交往中,人与人之间的消息传递显得尤为重要,如果一方不能及时将消息传递给另一方,那么,可能会发生一些无法预料的后果。

现假设 a \mathit a a 需要发送一条消息,那么,他会给他的联系人列表中的所有人各发送一条消息,而对于接收到该消息的某个人 b \mathit b b,如果此前已经收到过该消息,那么就会无视这条信息,否则, b \mathit b b 就会将这条消息转发给他的联系人列表中的所有人…
不断重复该转发过程,由于交际圈不可能无限大,所以最终一定会停止。

在上述情况下,假设最终知晓该条消息的总人数为 k ( \mathit k( k(包括发送者 a ) \mathit a) a),那么,就称这个交际圈大小为 k \mathit k k

若已知一个校园中有 n \mathit n n 个人,同时也知道他们两两之间能否互发消息,那么,这 n \mathit n n 个人就会被划分成若干个交际圈,现在,希望你快速求出,最大的交际圈和最小的交际圈之间的差距是多少?

输入描述

第一行输入两个正整数 n , m ( 2 ≤ n ≤ 1 0 5 , 1 ≤ m ≤ 1 0 5 ) n,m(2\le n\le 10^5, 1\le m\le 10^5) n,m(2n105,1m105),依次代表人数以及关系数。

接下去 m \mathit m m 行,每行两个正整数 a ,   b ( 1  ≤   a ,   b   ≤   n ;   a   ≠   b ) \mathit a,\ \mathit b(\text 1\ \leq\ \mathit a,\ \mathit b\ \leq\ \mathit n;\ \mathit a\ \ne\ \mathit b) a, b(1  a, b  n; a = b),表示 a \mathit a a b \mathit b b 之间可以互发消息。

输出描述

一行输出一个整数代表最大的交际圈以及最小的交际圈之间的差距。

特殊的,若 n \mathit n n 个人同属于一个交际圈,也就不存在最大、最小之分,那么,不需要输出任何一个整数,请用字符串 WOW 表示此情景。

input
3 1
1 3
output
1
input
2 1
2 1
output
WOW

思路

(需要用到并查集数据结构)用并查集储存每个人的父亲节点,父亲节点相同的人为一个社交圈,统计每个父亲节点在 f [ i ] f[i] f[i]中出现的次数,最大减最小即可,注意特判 n n n 个人皆在同一社交圈的情况。

Accepted code

/*
 * @Autor: CofDoria
 * @Date: 2020-11-21 13:08:56
 * @LastEditTime: 2020-11-21 13:25:31
 */
#include <bits/stdc++.h>
using namespace std;

#define db double
#define ll long long
#define inf 0x3f3f3f3f
#define s(a, n) memset(a, n, sizeof(a))
#define debug(a) cout << '#' << a << '#' << endl
#define rep(l, a, b) for (register ll l = a; l < b; ++l)
#define per(l, a, b) for (register ll l = a; l >= b; --l)
#define _ios ios::sync_with_stdio(false), cin.tie(0), cout.tie(0)
#define _forit(i, c) \
    for (__typeof__((c).begin()) i = (c).begin(); i != (c).end(); ++i)

bool fi = true;
const unsigned long long MOD = 1e9 + 7;

inline ll gcd(ll a, ll b) {
    return (b == 0 ? a : gcd(b, a % b)); }

int n, m;
int f[100005];
int num[100005];

int find(int a) {
    return f[a] == a ? a : f[a] = find(f[a]); }

int main() {
   
    // freopen("in.txt", "r", stdin);
    // freopen("out.txt", "w", stdout);
    memset(num, 0, sizeof(num));
    scanf("%d%d", &n, &m);
    for (int i = 1; i <= n; i++) f[i] = i;
    for (int i = 0; i < m; i++) {
   
        int a, b, fa, fb;
        scanf("%d%d", &a, &b);
        fa = find(a);
        fb = find(b);
        if (fa != fb) {
   
            f[fa] = fb;
        }
    }
    for (int i = 1; i <= n; i++) find(i);
    for (int i = 1; i <= n; i++) {
   
        // printf("%d\n", f[i]);
        num[f[i]]++;
    }
    int maxn = 0;
    int minn = n + 1;
    for (int i = 1; i <= n; i++) {
   
        // printf("%d\n", num[i]);
        if (num[i] > maxn) maxn = num[i];
        if (num[i] < minn && num[i]) minn = num[i];
    }
    if (maxn == n)
        printf("WOW");
    else
        printf("%d", maxn - minn);
    // fclose(stdin);
    // fclose(stdout);
    return 0;
}

D 战力对比

题目描述

皮卡丘正在对小智的 n \mathit n n

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值