欢乐赛#41全题解
2025-02-17 20:30:28
发布于:江苏
前言:
本人之前处于瓶颈期,连续4次欢乐赛没AK,今天也是重回巅峰拿下第20名!
第二次写哈,应该能比第一次好点了。。。
废话不多说上题解
T1:整数部分
这题没什么好说的纯属签到,有好几种方法,int()或floor()函数都可以,也可以直接不用double定义直接上int,我在此用本人原代码
本题C++代码如下:
#include<bits/stdc++.h>
using namespace std;
int main()
{
double a;
cin>>a;
cout<<int(a);
return 0;
}
T2:差值最大
这题我个人觉得Python好写一点,只需用一个列表加max与min函数就行了,最后相减。
C++也一样,不过需要稍微分析一下,输出那一行大概是这样的cout<<max(a,max(b,c))-min(a,min(b,c));
其实和Python差不多
本题Python代码如下:
d=[]
a,b,c=map(int,input().split(" "))
d.append(a)
d.append(b)
d.append(c)
print(max(d)-min(d))
T3:寻找倍数
本题就是先输入一个二维数组,接着把这个数组用二重循环遍历一下,寻找m的倍数并建立一个变量存储倍数个数,最后输出这个变量,简单至极。
其实我也是在Dev里试了三次
本题C++代码如下:
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n,m;
cin>>n>>m;
int tt=0;
int a[1005][1005];
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
cin>>a[i][j];
}
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
if(a[i][j]%m==0)
{
tt++;
}
}
}
cout<<tt;
return 0;
}
T4:冒泡排序
这题直接在冒泡排序框架的基础上改动一下就好了,注意交换位置的函数是swap(),两次循环的次数分别是m和n-i。
如果有人没学过冒泡排序,不要慌,冒泡的精髓凝结成一句话就是:
每次遍历时将相邻两个数作比较,前面比后面大就将前面的移动到后面!
本题C++代码如下:
#include<bits/stdc++.h>
using namespace std;
int main()
{
int a[1005];
int n,m;
cin>>n>>m;
for(int i=1;i<=n;i++)
{
cin>>a[i];
}
for(int i=1;i<=m;i++)
{
for(int j=1;j<=n-i;j++)
{
if(a[j]>a[j+1])
{
swap(a[j],a[j+1]);
}
}
}
for(int i=1;i<=n;i++)
{
cout<<a[i]<<" ";
}
return 0;
}
T5:最短路径
这题绝对是最难的一题!但我发现好像用优先搜索是最麻烦的。。。一个while循环就能解决竟然被我整这么复杂
先定义BFS函数表示最少次数,接着我用n1和n2来表示两种不同的运算方式,最后输出不解释。
本题C++代码如下:
#include<bits/stdc++.h>
#include<queue>
#include<unordered_set>
using namespace std;
int mn(int a,int b)
{
if(a==b)
{
return 0;
}
queue<pair<int,int>>q;
q.push({a,0});
unordered_set<int>visited;
visited.insert(a);
while(!q.empty())
{
auto[current,steps]=q.front();
q.pop();
if(current==b)
{
return steps;
}
int n1=current*2;
if(n1<=10000&&visited.find(n1)==visited.end())
{
q.push({n1,steps+1});
visited.insert(n1);
}
int n2=current-1;
if(n2>=0&&visited.find(n2)==visited.end())
{
q.push({n2,steps+1});
visited.insert(n1);
}
}
}
int main()
{
int n;
cin>>n;
for(int i=1;i<=n;i++)
{
int a,b;
cin>>a>>b;
cout<<mn(a,b)<<endl;
}
return 0;
}
T6:组队问题
这题我本来以为挺难,结果硬是十几行干出来了。
其实本题灵活动脑是很简单的,因为题目中这两种总人数都为3人只需用(a+b)/3和a与b的最小值求最小值就行了,也就是缩水之后的公式而已。
本题C++代码如下:
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n;
cin>>n;
for(int i=1;i<=n;i++)
{
int a,b;
cin>>a>>b;
int mx=min((a+b)/3,min(a,b));
cout<<mx<<endl;
}
return 0;
}
THE END
全部评论 2
"前言:
现在欢乐赛真的太水了。。。本人萌新都已经AK两次了
第一次写题解哈,如有不足请指出!
实在不会搞链接,不好意思不能让大家立刻看到题目
贺上前十!"1周前 来自 上海
0......
1周前 来自 上海
0
顶
2025-02-17 来自 江苏
0
有帮助,赞一个