本题解按本人出题顺序排列
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(5≤T≤200),表示参赛的人数。
接下来 T 行,每行一个整数 N ( 0 ≤ N ≤ 10 ) N(0\le N \le 10) N(0≤N≤10),表示参赛者的过题数。
输出描述
如果没有一个参赛者过了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(2≤n≤105,1≤m≤105),依次代表人数以及关系数。
接下去 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