欢乐赛#56 非官方题解
2025-09-21 22:01:03
发布于:香港
欢乐赛#56难度猜测,仅供参考:
题号 | 题目 | 难度 |
---|---|---|
T1 | 火眼金睛 | |
T2 | GCD+LCM | |
T3 | 蓝图研究 | |
T4 | 日程表 | |
T5 | 活动积分 | |
T6 | 自动批改 |
T1. 火眼金睛
题目大意:
输出一行,丨|ㄧ_O0晚晩晩晚
解题思路:
直接输出
参考代码:
#include <bits/stdc++.h>
using namespace std;
#define solve cout << "丨|ㄧ_O0晚晩晩晚";
int main() {
solve;
}
T2. GCD+LCM
题目大意:
给你两个数,求出和。
解题思路:
可以使用函数__gcd(a, b)
和 a * b / __gcd(a, b)
。
参考代码:
#include <bits/stdc++.h>
using namespace std;
int main() {
int a, b; cin >> a >> b;
cout << __gcd(a, b) << " " << a * b / __gcd(a, b);
}
T3. 蓝图研究
题目大意:
每一轮的研究时间为前面研究的总时间+当前这轮研究所需的额外时间
解题思路:
我们可以这样推出公式:
轮 | 每一轮使用的时间 | 总时间 |
---|---|---|
参考代码:
#include <bits/stdc++.h>
using namespace std;
int a[35];
int main() {
int n;
cin >> n;
for(int i = 1; i <= n; i++) {
cin >> a[i];
}
long long ans = 0;
for(int i = 1; i <= n; i++) {
ans = 2 * ans + a[i];
}
cout << ans;
}
T4. 日程表
题目大意:
给你几个日期,要求按照时间顺序来排序
解题思路:
很经典的结构体排序,利用来记录
参考代码:
#include <bits/stdc++.h>
using namespace std;
struct Node {
int x, y;
}a[110];
bool cmp(Node a, Node b) {
if(a.x != b.x) return a.x < b.x;
return a.y < b.y;
}
int main() {
int n; cin >> n;
for(int i = 1; i <= n; i++) cin >> a[i].x >> a[i].y;
sort(a + 1, a + n + 1, cmp);
for(int i = 1; i <= n; i++) cout << a[i].x << " " << a[i].y << endl;
}
T5. 活动积分
题目大意:
活动有不同的大小类型A B C D E
, 每种类型都有单人积分奖励上限
,给出活动大小类型,标准参加人数
和实际参加人数和
。
解题思路:
利用多个分支结构,判断一下即可。
参考代码:
#include <bits/stdc++.h>
#define int long long
using namespace std;
signed main() {
string z, s;
int a, b;
cin >> z >> b;
s = z[0];
if(z.size() == 3) {
a = z[1] - '0';
a = a * 10 + (z[2] - '0');
} else {
a = z[1] - '0';
}
if(s == "A") {
if(a < b) {
cout << 37500 * a / b;
return 0;
} else {
cout << 37500;
return 0;
}
} else if(s == "B") {
if(a < b) {
cout << 47500 * a / b;
return 0;
} else {
cout << 47500;
return 0;
}
} else if(s == "C") {
if(a < b) {
cout << 49000 * a / b;
return 0;
} else {
cout << 49000;
return 0;
}
} else if(s == "D") {
if(a < b) {
cout << 52000 * a / b;
return 0;
} else {
cout << 52000;
return 0;
}
} else if(s == "E") {
if(a == 10) {
if(a < b) {
cout << 80000 * a / b;
return 0;
} else {
cout << 80000;
return 0;
}
} else if(a == 30) {
if(a < b) {
cout << 160000 * a / b;
return 0;
} else {
cout << 160000;
return 0;
}
}
}
return 0;
}
T6. 自动批改:
题目大意:
给你一个字符串,表示正确答案,判断分数,最后按照分数排序。
解题思路:
基本分支结构+结构体排序,但要确认阅读程序题是4+2
参考代码:
#include <bits/stdc++.h>
#define endl '\n'
#define int long long
using namespace std;
struct Node {
int id;
double mark;
}a[55];
bool cmp(Node x, Node y) {
if(x.mark != y.mark) return x.mark > y.mark;
return x.id < y.id;
}
signed main() {
int n; cin >> n;
string s;
cin >> s;
for(int z = 1; z <= n; z++) {
string ans;
cin >> ans;
double marks = 0;
for(int i = 1; i <= 49; i++) {
if(i <= 15) {
if(ans[i - 1] == s[i - 1]) marks += 2;
} else if(i == 16 || i == 17 || i == 18 || i == 19 || i == 22 || i == 23 || i == 24 || i == 25 || i == 28 || i == 29 || i == 30 || i == 31 || i == 34 || i == 35 || i == 36 || i == 37) {
if(ans[i - 1] == s[i - 1]) marks += 1.5;
} else if(i == 20 || i == 21 || i == 26 || i == 27 || i == 32 || i == 33 || i == 38 || i == 39) {
if(ans[i - 1] == s[i - 1]) marks += 2;
} else if(i >= 40 && i <= 49) {
if(ans[i - 1] == s[i - 1]) marks += 2;
}
}
a[z].id = z;
a[z].mark = marks;
}
sort(a + 1, a + n + 1, cmp);
for(int i = 1; i <= n ;i++) cout << a[i].id << " " << a[i].mark << endl;
return 0;
}
这里空空如也
有帮助,赞一个