欢乐赛#43非官方全题解
2025-03-16 22:07:30
发布于:北京
一、买花
就是简单的 语句。
Code:
#include <bits/stdc++.h>
//using namespace std;
int n;
void solve ()
{
//main;
std::cin >> n;
if (n <= 100)
std::cout << n << std::endl;
else if (n >= 101 and n <= 200)
std::cout << n - 10 << std::endl;
else if (n >= 201 and n <= 300)
std::cout << n - 20 << std::endl;
else
std::cout << n - 50 << std::endl;
return ;
}int main ()
{
//main;
int T = 1;
//cin >> T;
while (T --)
solve ();
return 0;
}
二、有趣的任务
主要考的就是数组的基本操作和交换函数的使用。
你可以手写一个swap函数:
void swap (int x, int y)
{
int t = x;
x = y;
y = t;
return ;
}
也可以直接调用系统函数:
std::swap (x, y);
最后再加上数组和变量的输入与输出,它们都在int的范围以内。
Code:
#include <bits/stdc++.h>
#define Ll long long
//#define std::endl "\n"
const int N = 1e3 + 10, M = 1e2 + 10;
//using namespace std;
Ll T = 1;
int n, a[N] = {};
void solve ()
{
//main;
std::cin >> n;
int x, y; std::cin >> x >> y;
for (int i = 1; i <= n; ++ i)
std::cin >> a[i];
std::swap (a[x], a[y]);
for (int i = 1; i <= n; ++ i)
std::cout << a[i] << ' ';
std::cout << std::endl;
return ;
}int main ()
{
//main;
//cin >> T;
solve ();
return 0;
}
三、摘苹果
这题你可以先求出数组中所有元素之和,再减去四个角上的元素。
注意:由于一个位置最大就可以是 , 而最多有1000个点, 那么必然会爆 int 。作者第一遍没开long long, WA了。
Code:
#include <iostream>
#include <algorithm>
#include <cstring>
#include <string>
#include <vector>
#include <set>
#include <map>
#include <cmath>
#include <queue>
#include <random>
//#define endl "\n"
#define Ll long long
#define true 1
#define false 0
//using namespace std;
const int N = 1e3 + 10, M = 1e2 + 10;
const int dx[] = {-1, 0, 1, 0};
const int dy[] = {0, 1, 0, -1};
Ll T = 1;
int n, a[N][N];
void solve ()
{
//main;
std::cin >> n;
Ll sum = 0;
for (int i = 0; i < n; ++ i)
for (int j = 0; j < n; ++ j)
{
std::cin >> a[i][j];
sum += a[i][j];
}
sum -= a[0][0];
sum -= a[0][n - 1];
sum -= a[n - 1][0];
sum -= a[n - 1][n - 1];
std::cout << sum << std::endl;
return ;
}int main (int argc, const char * argv[])
{
//main;
//cin >> T;
while (T --)
{
solve ();
}return 0;
}
四、数位和为k的个数
这道题可以直接写暴力,最坏的情况需要枚举 个数,一个数最长有5位, 则砸坏情况的复杂度是 ,没有超过 。
先写一个 check () 函数:
bool check (std::string s, int k)
{
int len = s.length ();
int sum = 0;
for (int i = 0; i < len; ++ i)
sum += s[i] - '0';
//std::cout << sum << ' ';
return sum == k;
}
接着写一个 for () 循环,里面加上 check () 函数:
int cnt = 0;
for (int i = l; i <= r; ++ i)
if (check (std::to_string(i), k)) cnt ++;
注意:题目中写的是[l,r],所以for循环中的i要包含l和r。作者第一次没包含,WA了。
Code:
#include <iostream>
#include <algorithm>
#include <cstring>
#include <string>
#include <vector>
#include <set>
#include <map>
#include <cmath>
#include <queue>
#include <random>
//#define endl "\n"
#define Ll long long
#define true 1
#define false 0
//using namespace std;
const int N = 1e3 + 10, M = 1e2 + 10;
const int dx[] = {-1, 0, 1, 0};
const int dy[] = {0, 1, 0, -1};
Ll T = 1;
bool check (std::string s, int k)
{
int len = s.length ();
int sum = 0;
for (int i = 0; i < len; ++ i)
sum += s[i] - '0';
//std::cout << sum << ' ';
return sum == k;
}void solve ()
{
//main;
int l, r; std::cin >> l >> r;
int k; std::cin >> k;
int cnt = 0;
for (int i = l; i <= r; ++ i)
if (check (std::to_string(i), k)) cnt ++;
std::cout << cnt << std::endl;
return ;
}int main (int argc, const char * argv[])
{
//main;
//cin >> T;
while (T --)
{
solve ();
}return 0;
}
五、KMP算法
这道题似乎是春节巅峰赛第五题的削弱版。
这是我巅峰赛的代码:
#include <iostream>
#include <algorithm>
#include <cstring>
#include <string>
#include <vector>
#include <set>
#include <map>
#include <cmath>
#define endl "\n"
#define Ll long long
#define true 1
#define false 0
using namespace std;
const int N = 1e5 + 10, M = 1e2 + 10;
const int dx[] = {-1, 0, 1, 0};
const int dy[] = {0, 1, 0, -1};
const Ll mod = 998244353;
Ll T = 1;
int n, cnt_a, cnt_ac, cnt_acg, cnt_acgo;
string s;
void solve ()
{
//main;
cin >> n >> s;
for (int i = 0; i < n; i ++)
{
if (s[i] == 'a')
{
cnt_a ++;
cnt_a = cnt_a % mod;
}else if (s[i] == 'c')
{
cnt_ac += cnt_a;
cnt_ac = cnt_ac % mod;
}else if (s[i] == 'g')
{
cnt_acg += cnt_ac;
cnt_acg = cnt_acg % mod;
}else if (s[i] == 'o')
{
cnt_acgo += cnt_acg;
cnt_acgo = cnt_acgo % mod;
}
}cout << cnt_acgo % mod << endl;
return ;
}int main (int argc, const char * argv[])
{
//main;
//cin >> T;
while (T --)
{
solve ();
}return 0;
}
稍微改一下就成了这道题的标程:(Code:)
#include <bits/stdc++.h>
//#define endl "\n"
#define Ll long long
#define true 1
#define false 0
//using namespace std;
const int N = 2e5 + 10, M = 1e2 + 10;
const int dx[] = {-1, 0, 1, 0};
const int dy[] = {0, 1, 0, -1};
Ll T = 1;
std::string s;
void solve ()
{
//main;
std::cin >> s;
int len = s.length ();
int cnt_k = 0, cnt_m = 0, cnt_p = 0;
for (int i = 0; i < len; ++ i)
{
if (s[i] == 'K') cnt_k ++;
else if (s[i] == 'M') cnt_m += cnt_k;
else if (s[i] == 'P') cnt_p += cnt_m;
}std::cout << cnt_p << std::endl;
return ;
}int main (int argc, const char * argv[])
{
//main;
//cin >> T;
while (T --)
{
solve ();
}return 0;
}
个人认为这是本次欢乐赛最难的一题。
观察后发现,如果把题目降级为统计“KM”出现的次数,那么只需要用前面“K”出现的次数加上后面“M”的次数就是答案。
而如果加上“P”,那么cnt_KMP
等于cnt_KM
加上“P”出现的次数,如下图:
六、最大的质数
这道题的数据比较小,暴力是可以过的。
首先,我们写一个素数判断的函数:
bool is_prime (int x)
{
if (x <= 1) return false;
for (int i = 2; pow (i, 2) <= x; i ++)
{
if (x % i == 0) return false;
}
return true;
}
注意:for循环中要写小于等于,因为有完全平方数。
接下来,加上“q次询问”。找最大的,所以注意要倒着找。
Code:
#include <iostream>
#include <algorithm>
#include <cstring>
#include <string>
#include <vector>
#include <set>
#include <map>
#include <cmath>
#include <queue>
#include <random>
#define endl "\n"
#define Ll long long
#define true 1
#define false 0
using namespace std;
const int N = 1e5 + 10, M = 1e2 + 10;
const int dx[] = {-1, 0, 1, 0};
const int dy[] = {0, 1, 0, -1};
Ll T = 1;
int q, n;
bool is_prime (int x)
{
if (x <= 1) return false;
for (int i = 2; pow (i, 2) <= x; i ++)
{
if (x % i == 0) return false;
}
return true;
}void solve ()
{
//main;
cin >> q;
while (q --)
{
cin >> n;
for (int i = -- n; i >= 2; -- i)
if (is_prime (i))
{
cout << i << endl;
break;
}
}
return ;
}int main (int argc, const char * argv[])
{
//main;
//cin >> T;
while (T --)
{
solve ();
}return 0;
}
给个周边吧······
全部评论 2
兄弟,T5里面说了M只有一个
2025-03-17 来自 浙江
0哎呀,好像是啊。
2025-03-17 来自 北京
0但我这个能解决的问题更广泛唉!
2025-03-17 来自 北京
0
实际上你 T5 做法复杂了
只需要统计M
之前K
的数量和它之后P
的数量,最后相乘就行2025-03-17 来自 广东
0有道理,还是大佬的思路好。
2025-03-17 来自 北京
0但能想出通解确实很厉害
2025-03-17 来自 广东
0嗯嗯
2025-03-18 来自 北京
0
有帮助,赞一个