欢乐赛#38非官方全题解
2025-01-13 15:56:14
发布于:北京
一、转义字符输出
题目
众所周知,“\”是一个转意字符,它可以转变他后面的字符的功能。
那么问题来了:如何输出一个单独的“\”?
这个问题看似很难,实则一点都不简单。其实只需要用一个转意字符去转意一个转意字符。听着很绕,其实就是它:
cout << "\\" << endl;
Code:
#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 = 1e2 + 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];
void solve ()
{
//main;
return ;
}int main (int argc, const char * argv[])
{
//main;
//cin >> T;
while (T --)
{
solve ();
cout << "\\" << endl;
}return 0;
}
二、28转化
题目
其实就判断一下每个数位上的数字,符合要求就按题目要求操作。为了方便,我们用string:作者第一次顺手写了个int,CE了。
string s;
输入,便利,判断,输出:
cin >> s;
int len = (int) s.length ();
for (int i = 0; i < len; i ++)
{
if (s[i] == '2') s[i] = '8';
else if (s[i] == '8') s[i] = '2';
}cout << s << endl;
Code:
#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};
Ll T = 1;
string s;
void solve ()
{
//main;
cin >> s;
int len = (int) s.length ();
for (int i = 0; i < len; i ++)
{
if (s[i] == '2') s[i] = '8';
else if (s[i] == '8') s[i] = '2';
}cout << s << endl;
return ;
}int main (int argc, const char * argv[])
{
//main;
//cin >> T;
while (T --)
{
solve ();
}return 0;
}
注意:s.length ()函数返回的是一个double类型的数据,最好强转一下(不转也不是不行),判断的时候要加单引号。(双引号也行)作者第一次没加,WA了。
要是你不会字符串,你就用char输入一个判断一个,直接输出。
Code2:
#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};
Ll T = 1;
char c;
void solve ()
{
//main;
while (cin >> c)
{
if (c == '2') cout << '8';
else if (c == '8') cout << '2';
else cout << c;
}cout << endl;
return ;
}int main (int argc, const char * argv[])
{
//main;
//cin >> T;
while (T --)
{
solve ();
}return 0;
}
三、商品降价
题目
看着挺难,先来个输入:
cin >> n;
for (int i = 0; i < n; i ++) cin >> a[i];
说要给最贵的打折。那就先求一下最大的:
int mx = -1;
for (int i = 0; i < n; i ++) mx = max (mx, a[i]);
手动算一下样例:发现总共要付的 = a[0] + a[1] + ··· + (最贵的 / 2) = 所有的 - (最贵的 / 2)。
那不就好说了,先求总共的,放同一个循环里吧:
for (int i = 0; i < n; i ++)
{
cin >> a[i];
mx = max (mx, a[i]);
sum += a[i];
}
输出:
cout << sum - mx / 2 << endl;
Code:
#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 = 1e2 + 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];
void solve ()
{
//main;
cin >> n;
int mx = -1, sum = 0;
for (int i = 0; i < n; i ++)
{
cin >> a[i];
mx = max (mx, a[i]);
sum += a[i];
}cout << sum - mx / 2 << endl;
return ;
}int main (int argc, const char * argv[])
{
//main;
//cin >> T;
while (T --)
{
solve ();
}return 0;
}
四、The 2024 ICPC Asia East Continent Final Contest
题目
题目好长~,但全是废话。其实就一个if的事,作者还写了个函数:
string _chose (int x, int y)
{
if (x > 6 || (x == 6 && y <= 1116)) return "Gold";
else if (x > 4 || (x == 4 && y <= 556)) return "Silver";
else if (x > 3 || (x == 3 && y <= 357)) return "Bronze";
else if (x >= 1) return "Ferrum";
return "Traval";
}
注意:题目中的a和b就是函数中的x和y。
有函数了,就直接调用一下就行了。输入,调用,输出:
cin >> a >> b;
cout << _chose (a, b) << endl;
Code:
#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};
Ll T = 1;
int n, a, b;
string _chose (int x, int y)
{
if (x > 6 || (x == 6 && y <= 1116)) return "Gold";
else if (x > 4 || (x == 4 && y <= 556)) return "Silver";
else if (x > 3 || (x == 3 && y <= 357)) return "Bronze";
else if (x >= 1) return "Ferrum";
return "Traval";
}void solve ()
{
//main;
cin >> a >> b;
cout << _chose (a, b) << endl;
return ;
}int main (int argc, const char * argv[])
{
//main;
cin >> T;
while (T --)
{
solve ();
}return 0;
}
五、染色问题
题目
这道题硬控作者2个小时,就一道找规律。
造数据!
当只有一个皮球时,颜色的数量、方案数:
m | 方案数 |
---|---|
2 | 2 |
5 | 5 |
10 | 10 |
不难发现,当n == 1时,方案数就是m,如下:
if (n == 1) cout << m << endl;
当有多个皮球时,颜色的数量、方案数:
例:有4个皮球,3种颜色:
皮球编号 | 可选颜色数量 |
---|---|
1 | 3 |
2 | 2 |
3 | 2 |
4 | 2 |
有3个皮球,2种颜色:
皮球编号 | 可选颜色数量 |
---|---|
1 | 2 |
2 | 1 |
3 | 1 |
也就是说,第一个有m种,后面都有(m - 1)种,如下:
Ll sum = m;
n --;
while (n --)
{
sum = sum * (m - 1);
sum = sum % mod;
}cout << sum % mod << endl;
注意:每次乘完之后都要进行取模,mod是提前定义好的变量,按照题目要求,是:998244353。作者只在最后输出时取模了,WA了。
Code:
#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};
Ll T = 1;
Ll n, m;
const Ll mod = 998244353;
void solve ()
{
//main;
cin >> n >> m;
if (n == 1ll) cout << m << endl;
else
{
Ll sum = m;
n --;
while (n --)
{
sum = sum * (m - 1);
sum = sum % mod;
}cout << sum % mod << endl;
}return ;
}int main (int argc, const char * argv[])
{
//main;
cin >> T;
while (T --)
{
solve ();
}return 0;
}
六、放烟花啦
题目
第一遍读挺难的,其实就一个输出就能解决。
先写简单的输入:
cin >> a >> b >> m;
要求最多能看到的,那就先将小王和小美分别单独能看到的求出来,最后再加起来。
小王:
cout << m / a << endl;//从第一根被点燃开始算,求其中包含几次。
考虑到第0分钟时会有一根,而且c++种的“\”时向下取整,所以:
cout << m / a + 1 << endl;
才是正确的。这里不加“+1”会WA,作者被硬控了20分钟。
根据小王的,能求出小美的计算公式:
cout << m / b + 1 << endl;
加在一起就是:
cout << (m / a + 1) + (m / b + 1) << endl;
Code:
#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};
Ll T = 1;
Ll a, b, m;
void solve ()
{
//main;
return ;
}int main (int argc, const char * argv[])
{
//main;
cin >> T;
while (T --)
{
solve ();
cin >> a >> b >> m;
cout << (m / a + 1) + (m / b + 1) << endl;
}return 0;
}
注意:代码中的“solve”没有实际上的用途,只是作者顺手写的程序框架。
给个周边吧······
这里空空如也
有帮助,赞一个