欢乐赛#55非官方全题解
2025-08-31 22:32:56
发布于:江苏
前言:第一次发欢乐赛题解,别喷。直接开始
现在的欢乐赛真的是越来越难了,最后一题都有位运算了
题号 | 题目名 | 知识点 |
---|---|---|
T1 | 奇数判断 | 分支、输入输出 |
T2 | 小明和神秘宝箱 | 循环结构 |
T3 | 找出卧底 | 字符串、循环结构 |
T4 | 寻找最小公倍数 | 递归/递推 |
T5 | 对称矩阵 | 二维数组 |
T6 | 宝石项链 | 结构体、位运算(vector) |
大意:a*b-c是否是一个奇数,是则输出Yes;否则输出No。
水题,直接判断。
#include<iostream>
using namespace std;
int main(){
int a,b,c;
cin>>a>>b>>c;
if((a*b-c)%2==0){//别忘了a*b-c加括号,不然会先算c%2
cout<<"No";
}else{
cout<<"Yes";
}
return 0;
}
时间复杂度:
空间复杂度:
大意:输入n,接下来n行,每行两个整数,代表每个宝箱最少能获得个金币,最多能获得个金币。
思路:分别定义两个变量minn
和maxn
,来存最少金币之和和最多金币之和。注意:因为n最大为,最大为,故累加器得开long long
(最大为)
#include<iostream>
using namespace std;
int main(){
int n;
long long minn=0,maxn=0;//再次强调:得开long long!!!
cin>>n;
while(n--){
int l,r;
cin>>l>>r;
minn+=l;//每个宝箱的最少金币数
maxn+=r;//最个宝箱的最多金币数
}
cout<<minn<<' '<<maxn;
return 0;
}
时间复杂度:
空间复杂度:
大意:输入n个字符串,在不考虑大小写的情况下,如果字符串为WOHEYEZHI
,则说明是卧底。找出一共有几个卧底
思路:先定义计数器cnt
,然后遍历字符串,把所有字母统一转大写/小写。最后判断是否是WOHEYEZHI
,是则累加。输出cnt
#include<iostream>
#include<string>
using namespace std;
int main(){
int n,cnt=0;
cin>>n;
for(int i=0;i<n;i++){
string s;
cin>>s;
for(int j=0;j<s.size();j++){
if(s[j]>='a'&&s[j]<='z'){
s[j]-=' ';//统一转大写,也可以统一转小写
}
}
if(s=="WOHEYEZHI"){
cnt++;//是卧底
}
}
cout<<cnt;
return 0;
}
时间复杂度:
空间复杂度:
大意:给定一个长度为 n 的数组,对于数组中所有的数对, 求的最小公倍数的最大值。
作者语文不太好,直接复制题面,实在不能简化了
思路:双层for循环,找出所有可能的,求出最大公约数,再使用ans
记录最大值。
#include<iostream>
#include<cmath>
#include<algorithm>//__gcd要用
using namespace std;
int main(){
int n,ans=0;
cin>>n;
int a[n+10];
for(int i=0;i<n;i++){
cin>>a[i];
}
for(int i=1;i<n;i++){
for(int j=0;j<i;j++){
ans=max(ans,a[i]*a[j]/__gcd(a[i],a[j]));//记录最大值
}
}
cout<<ans;
return 0;
}
解释一下__gcd
:C++自带求最大公约数的函数,需要使用头文件#include<algorithm>
。以后再也不用担心考试的时候忘记辗转相除法怎么写了
常规做法:
#include<iostream>
#include<cmath>
using namespace std;
int gcd(int a,int b){
if(a%b==0){
return b;
}else{
return gcd(b,a%b);
}
}
int main(){
int n,ans=0;
cin>>n;
int a[n+10];
for(int i=0;i<n;i++){
cin>>a[i];
}
for(int i=1;i<n;i++){
for(int j=0;j<i;j++){
ans=max(ans,a[i]*a[j]/gcd(a[i],a[j]));
}
}
cout<<ans;
return 0;
}
时间复杂度:
空间复杂度:
大意:t组样例,每组样例给一个n行n列的矩阵,如果矩阵上下对称且左右对称,输出YES
,否则输出NO
思路:定义flag
用来判断是否对称。遍历矩阵,如果不对称,flag标记。如果flag没被标记,输出YES
,否则输出NO
#include<iostream>
using namespace std;
int main(){
int t;
cin>>t;
while(t--){
int n;
bool flag=0;
cin>>n;
int a[n+10][n+10];
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
cin>>a[i][j];
}
}
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
if(a[n-i-1][j]!=a[i][j]){//上下是否对称
flag=1;
break;
}
if(a[i][n-j-1]!=a[i][j]){//左右是否对称
flag=1;
break;
}
}
if(flag==1){//不是对称矩阵
break;
}
}
if(flag==1){
cout<<"NO\n";
}else{
cout<<"YES\n";
}
}
return 0;
}
时间复杂度:
空间复杂度:
虽然样例不太严谨,t最大为,n最大为,时间复杂度最大为,我竟然过了(每秒最多次运算)
大意:给定一条有 n 个宝石的项链,每个宝石有对应的颜色值。每种颜色的美丽值为颜色值乘以该颜色所有宝石编号的异或和,求所有颜色美丽值的总和。
思路:定义一个结构体(也可以是pair)动态数组,存储每个宝石的颜色及其编号相同颜色的宝石进行异或,再乘以其颜色。将所有颜色宝石的美丽值加起来,便是整条项链的美丽值(别忘了开long long
)
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
struct node{
int first,second;
};
bool cmp(node a,node b){
return a.first<b.first;
}
int main(){
int n;
cin>>n;
vector<node>a(n);
for(int i=0;i<n;i++){
cin>>a[i].first;
a[i].second=i+1;//宝石的编号
}
sort(a.begin(),a.end(),cmp);//相同颜色的宝石放在一起
long long sum=0,st=a[0].first,nd=a[0].second;
for(int i=1;i<n;i++){
if(a[i].first==st){
nd^=a[i].second;//相同则异或
}else{
sum+=(long long)st*nd;//不同了就累加,然后更新颜色、编号
st=a[i].first;
nd=a[i].second;
}
}
sum+=(long long)st*nd;
cout<<sum;
return 0;
}
时间复杂度:
空间复杂度:
再次声明,第一次写题解,勿喷!求赞!求置顶!
恭喜你看到了这里,如有疑问请留言,虽然第一次写,但求奖品,@AC君球球了。
然后……评论区见!
全部评论 5
写的真棒!!
昨天 来自 重庆
1666我还在想最后一题要哈希表,也不知道脑子咋想的。
2天前 来自 浙江
0本来是想写知识点哈希表的,但结构体也能做,就没写
2天前 来自 江苏
0我不知道结构体排序之后可以放一起
2天前 来自 浙江
0我看数据就知道暴力绝对过不了
2天前 来自 浙江
0
我赛时T5多交了3遍最后发现是写成了Yes/NoQAQ
2天前 来自 上海
0还是要审题啊
2天前 来自 江苏
0
顶顶顶
2天前 来自 天津
0谢谢
2天前 来自 江苏
0看看我新发的小说
2天前 来自 天津
0现在看不了,要写作业……
2天前 来自 江苏
0
顶
3天前 来自 江苏
0
有帮助,赞一个