ACGO元旦欢乐赛#37全题解
2025-01-05 22:21:34
发布于:上海
立志做全acgo最及时的欢乐赛优秀题解发布员
本人第一次写题解,不喜勿喷,有疑问或者建议可在讨论区提出,或者私信也可以
本人纯萌新,写一次题解,意在相互学习,以及分享我自己的思路给一些可能不会的朋友
题目没什么好评判的,有难有简,本人觉得难度还行
没搞链接,纯粹是作者懒刚结束欢乐赛,不想找链接麻烦。
下面是题解部分:
T1:
题目描述:
114514×1919810 的结果是?
思路分析:
直接两个数相乘,输出结果。
代码部分:
#include<iostream>
using namespace std;
int main()
{
long long a=114514,b=1919810;
cout<<a*b;
}
注意事项:
要用long long int 类型,不然会超出数据范围
T2:
题目描述:
给定一个整数 n,判断其各数位之和的奇偶性:
如果数位之和为奇数,输出 "YES";
如果数位之和为偶数,输出 "NO"。
思路分析:
输入的时候输入string类型,然后用 for 循环遍历,计算每一位的和,最后判断奇偶,然后输出结果
代码部分:
#include<iostream>
using namespace std;
int main()
{
int n;
cin>>n;
for(int i=0;i<n;i++)
{
string a;
cin>>a;
int sum=0;
for(int j=0;j<a.size();j++)
{
sum+=a[j]-'0';
}
if(sum%2==1) cout<<"YES"<<endl;
else cout<<"NO"<<endl;
}
}
注意事项:
记得string每一位遍历的时候要减去一个'0'
T3:
题目描述:
给你两个数 a 和 b,求这两个数的最小公倍数。
思路分析:
先辗转相除法求最大公约数,然后两个数相乘再除以最小公倍数
代码部分:
#include<iostream>
using namespace std;
long long gcd(long long a,long long b)
{
if(b==0)return a;
return gcd(b,a%b);
}
int main()
{
long long x,y;
cin>>x>>y;
cout<<x*y/gcd(x,y);
}
注意事项:
结果可能会超过int,建议用long long int
T4:
题目描述:
给定一个字符串 S,请构造一个新的字符串,形式为:原字符串 S 与其反转后的字符串拼接在一起的结果。最后输出该新字符串。
思路分析:
先输入string,然后用 for 循环先从前到后遍历输出,再从后往前遍历输出
代码部分:
#include<iostream>
using namespace std;
int main()
{
string a;
cin>>a;
for(int i=0;i<a.size();i++)
{
cout<<a[i];
}
for(int i=a.size()-1;i>=0;i--)
{
cout<<a[i];
}
}
注意事项:
不要输出空格,还有用a.size()的时候注意下标
T5:
中间的数
题目描述:
(有下标存在,不好用文字打出来,可以自己去看)
思路分析:
题目核心部分让我们将列表中间值加1,然后算操作几次可以让中间值加1。可以先按要求求出中间值的位置(本人的mid遍量),然后取出原列表的中间值(ym变量),随后进行对列表的操作,每次给处于mid位置的值加1,然后用sort排序(快速单调不减排序),这两行算一次操作,执行到现有的mid位置的数比ym大1后结束循环,输出次数即可。
代码部分:
#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
int n,m,a[1500];
cin>>n;
while(n--)
{
cin>>m;
for(int i=0;i<m;i++)
{
cin>>a[i];
}
sort(a,a+m);
int mid;
if(m%2==0) mid=m/2;
else mid=m/2+1;
mid--;
int ym=a[mid];
int sum=0;
while(a[mid]!=ym+1)
{
a[mid]+=1;
sum++;
sort(a,a+m);
}
cout<<sum<<endl;
}
}
注意事项:
sort排序要导入algorithm,mid的计算要按照要求
T6:
题目描述:
小码君正在玩一个 3 × 3 的灯格游戏。游戏开始时,所有灯都处于开启状态。按下任意一个灯会切换它的状态,同时切换与它上下左右相邻灯的状态。
游戏的目标是将所有灯关闭。切换规则如下:
如果灯是开启的,被切换后会关闭;
如果灯是关闭的,被切换后会开启。
小码君玩了一段时间后,每个灯都被按下了若干次。现在,给定每个灯被按下的次数,请输出每个灯当前的状态。
思路分析:
(说实话,我这个代码非常的暴力但好用。)
首先先定义两个二维数组,分别表示按下的次数,和被切换的次数。然后输入按下的次数(我自己的代码解析:输入后%2,因为按两次相当于没按)然后遍历每个按下的次数,给周围以及自己增加一次被切换的次数(我那么一长串就是干这个的),最后遍历被切换的次数,最后输出结果
代码部分:
#include<iostream>
using namespace std;
int main()
{
long long a[3][3]={};
int b[3][3];
for(int i=0;i<3;i++)
{
for(int j=0;j<3;j++)
{
int n;
cin>>n;
b[i][j]=n%2;
}
}
//
//
if(b[0][0]>=1)
{
int x=b[0][0];
for(int i=0;i<x;i++)
{
a[0][0]++;
a[0][1]++;
a[1][0]++;
}
}
if(b[0][1]>=1)
{
int x=b[0][1];
for(int i=0;i<x;i++)
{
a[0][0]++;
a[0][1]++;
a[0][2]++;
a[1][1]++;
}
}
if(b[0][2]>=1)
{
int x=b[0][2];
for(int i=0;i<x;i++)
{
a[0][1]++;
a[0][2]++;
a[1][2]++;
}
}
//
//
//
//
//
if(b[1][0]>=1)
{
int x=b[1][0];
for(int i=0;i<x;i++)
{
a[0][0]++;
a[1][0]++;
a[1][1]++;
a[2][0]++;
}
}
if(b[1][1]>=1)
{
int x=b[1][1];
for(int i=0;i<x;i++)
{
a[0][1]++;
a[1][0]++;
a[1][1]++;
a[1][2]++;
a[2][1]++;
}
}
if(b[1][2]>=1)
{
int x=b[1][2];
for(int i=0;i<x;i++)
{
a[0][2]++;
a[1][1]++;
a[1][2]++;
a[2][2]++;
}
}
//
//
//
//
//
if(b[2][0]>=1)
{
int x=b[2][0];
for(int i=0;i<x;i++)
{
a[1][0]++;
a[2][0]++;
a[2][1]++;
}
}
if(b[2][1]>=1)
{
int x=b[2][1];
for(int i=0;i<x;i++)
{
a[1][1]++;
a[2][0]++;
a[2][1]++;
a[2][2]++;
}
}
if(b[2][2]>=1)
{
int x=b[2][2];
for(int i=0;i<x;i++)
{
a[1][2]++;
a[2][1]++;
a[2][2]++;
}
}
//
//
for(int i=0;i<3;i++)
{
for(int j=0;j<3;j++)
{
a[i][j]%=2;
if(a[i][j]==1) cout<<0;
else cout<<1;
}
cout<<endl;
}
}
注意事项:
优化一下我的代码长度吧,实在是觉得遍历判断每个位置比较麻烦,就自己手动判断了
废话 结语环节:
本次的题目不是很难,重点应该是对于实现效果的思路,有了思路就能写个大概。
祝各位新的一年多多AC,比赛顺利,AK连连,好运不断
有想问的问题或者一些建议可以发在讨论区或者私信(包括我的代码看不懂,想要我分享一些做题时的想法之类的)本人会采取一些好的建议,相信我的题解会更加完善。
展望:
励志做优秀的欢乐赛题解发布者!
题解参考:
ACGO欢乐赛#36 全题解
全部评论 1
求顶
2025-01-05 来自 上海
1
有帮助,赞一个