# 官方题解|欢乐赛#38
2025-01-15 15:41:09
发布于:浙江
官方题解|欢乐赛#38
T1
对反斜杠进行转义一下即可。
#include <bits/stdc++.h>
using namespace std;
signed main(){
cout << '\\';
return 0;
}
T2
可以通过字符串的方式进行读入,遇到 修改成 ,遇到 修改成 ,用 if
语句简单判断一下即可。
#include <bits/stdc++.h>
using namespace std;
signed main(){
string s;
cin >> s;
for(auto &it : s){
if(it == '2') it = '8';
else if(it == '8') it = '2';
}
cout << s;
return 0;
}
T3
本题只需要先对整个数组求和,然后再减去最大的元素的值的一半即。
#include <bits/stdc++.h>
using namespace std;
const int N = 200010;
int a[N], n, m, k;
signed main(){
cin >> n;
for(int i = 1; i <= n; i ++ ){
cin >> a[i];
}
cout << accumulate(a + 1, a + 1 + n, 0) - *max_element(a + 1, a + 1 + n) / 2;
return 0;
}
T4
本题只要按照题目意思进行模拟判断即可,比如要拿金牌,有两种情况:
- 过题数超过金牌的
- 过题数等于金牌的 ,但是罚时要小于等于金牌的
同理,其余的奖项也一样讨论一下。还有一点,讨论的顺序要从金牌到铁牌,因为只拿最高奖项。
#include <bits/stdc++.h>
using namespace std;
void solve(){
int a, b;
cin >> a >> b;
if(a > 6 ||(a == 6 && b <= 1116)) cout << "Gold\n";
else if(a > 4 ||(a == 4 && b <= 556)) cout << "Silver\n";
else if(a > 3 ||(a == 3 && b <= 357)) cout << "Bronze\n";
else if(a >= 1) cout << "Ferrum\n";
else cout << "Traval\n";
}
signed main(){
int tt = 1;
cin >> tt;
while(tt -- ){
solve();
}
return 0;
}
T5
假设是第 个球,那么有 种染色方案,那么后面的所有的球道颜色都要和前一个不一样,所以都有 种方案,根据乘法原理,结论是 ,这题不用快速幂,直接循环模拟乘法即可。
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N = 200010, mod = 998244353;
int a[N], n, m, k;
void solve(){
int a, b;
cin >> a >> b;
int ans = 1;
for(int i = 1; i <= a; i ++ ){
if(i == 1) ans = (ans * (b % mod)) % mod;
else ans = (ans * ((b - 1) % mod)) % mod;
}
cout << ans << endl;
}
signed main(){
int tt = 1;
cin >> tt;
while(tt -- ){
solve();
}
return 0;
}
T6
在某一个时间段 内观察到的所有仙女棒,实际上是前 时间段内释放的仙女棒总和。因此,问题可以转化为:找到一个长度为 的时间段,使得这一时间段内释放的仙女棒数量最多。
为了让单根仙女棒在某一时间段内释放的次数达到最多,根据贪心策略,可以确定时间段的左端点应位于该仙女棒刚刚释放的时刻。假设这根仙女棒的释放间隔为 ,那么在长度为 的时间段内,这根仙女棒会释放 次。
类似地,对于两根仙女棒的情况,我们希望将时间段的左端点选在两根仙女棒同时释放的时刻。关键问题在于,这两根仙女棒是否会同时释放?如果两根仙女棒的释放间隔互为倍数,那么它们必然会同时释放;如果不是倍数关系,它们会在间隔的最小公倍数对应的时刻同时释放。因此,无论如何,两根仙女棒都会有同时释放的时刻。
综上,两个仙女棒在时间段内的总释放次数为
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N = 200010;
int a[N], n, m, k;
void solve(){
cin >> n >> m >> k;
cout << k / n + k / m + 2 << endl;
}
signed main(){
int tt = 1;
cin >> tt;
while(tt -- ){
solve();
}
return 0;
}
这里空空如也
有帮助,赞一个