ACGO欢乐赛题解#43
原题链接:41113.学术讨论群2025-03-18 17:06:24
发布于:浙江
T1买花
这道题也是水得不能再水了啊,主要考察分支结构,话不多说我们直接上代码:
#include<iostream>
using namespace std;
int main(){
int n;
cin>>n;
if(n<=100){
cout<<n<<endl;//100元以下无优惠
}else if(n<=200){
cout<<n-10<<endl;
//200元以下优惠10块,因为用的是else if所以就不需要再对底限做判断了,下方代码也是同理
}else if(n<=300){
cout<<n-20<<endl;
}else{
cout<<n-50<<endl;
}
return 0;
}
T2有趣的任务
这道题目的本质就是一维数组的增删改查。小编看了一下发现题目中有一个明显的错误啊,就是小明要交换下标为1和5的元素,但是样例中给的是下标为0和4的交换啊,不知道大伙发现了没有。
好了言归正传,在做这道题目的时候我们只需要以1为启始下标,循环读入数据,然后直接把a[b]和a[c]的数据交换一下就行了。然后数据范围是0~1000,大伙数组可不要开小了,不然白白浪费一次提交次数。ok我们上代码:
#include<iostream>
using namespace std;
int main(){
int n,a[1010]={},b,c;
cin>>n>>b>>c;
for(int i=1;i<=n;i++){
cin>>a[i];
}//对a数组循环读入
int nm=a[b];
a[b]=a[c];
a[c]=nm;
//直接交换a[b]和a[c]的数据
for(int i=1;i<=n;i++){
cout<<a[i]<<" ";
}//输出改好的数组
return 0;
}
再插一嘴:大家在竞赛的时候千万不要学我直接把a数组输出出来,因为这样输出结果会多空格,在正规的竞赛中都是不给分的。只能说AC官方的判题程序还是有些不严谨啊
T3摘苹果
也是一道水题啊,还是看我们对二维数组的熟悉程度,题目中描述是四个角落上的苹果不能摘,那么我们就可以先把所用方格内的数据加起来记为sun,再列出四个角落的下标,然后直接减掉就可以了。至于四个角落的下标,大伙可以参考下图:
然而,我们看一下数据范围:
“3<=n<=1000
1<=ai,j<=10^9”
很好,AC官方又在和我们玩文字游戏,那众所周知,c++的二维数组是开不到1000*1000的,(头铁的宝子可以去开全局变量,但是有可能RE)所以:我们真的一定要用二维数组吗?
我们可以摒弃对二维数组的刻板印象,直接用变量代替数组,从根本上解决问题(即在输入的时候就把sun累加起来),这样就可以完美地避开RE。ok我们上代码
#include<iostream>
using namespace std;
int main(){
int n,a;long long sun=0;//这里一定要开long long
cin>>n;
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
cin>>a;
if(i==1&&j==1||i==n&&j==1||i==1&&j==n||i==n&&j==n){//判断是否在角落上
continue;
}
sun+=a;//累加
}
}
cout<<sun;
return 0;
}
T4数位和为k的个数
这道题还算有点东西,还好本人学过高精度。在高精度算法中,我们把很大的数字拆开用数组存储,在这里也是一样。不懂的宝子可以参考一下下图:
首先呢,我们先把L,存入a[1]中,然后用一个循环把a从头到尾遍历一遍,用来处理进位,再把a中的每一个元素累加,记为sun,最后判断sun是否等于k就可以了。至于从L到R的遍历,因该没有人不会吧(不会的统统吃掉)。好的接着上代码:
#include<iostream>
using namespace std;
int main(){
int l,r,k,a[7]={},ans=0;
cin>>l>>r>>k;
a[1]=l;//把l存入a[1]
for(int i=l;i<=r;i++){
for(int j=1;j<=6;j++){
if(a[j]>=10){
a[j+1]+=a[j]/10;
a[j]=a[j]%10;
}
}//进位处理
int sun=0;
for(int j=1;j<=6;j++){
sun+=a[j];
}//累加
if(sun==k){
ans++;
}
a[1]++;//控制数组a从L到R的遍历
}
cout<<ans;
return 0;
}
T5KMP算法
这道题乍一看就是找到M的下标,然后找到M前K的数量和M后P的数量,最后乘起来就行了。细一看,还不如乍一看
#include <bits/stdc++.h>
using namespace std;
int main() {
string s;cin>>s;
int m=-1,cK=0,cP=0;
for (int i=0;i<s.size();i++){//找到m的下标
if(s[i]=='M'){
m=i;
break;
}
}for (int i=0;i<m;i++){//找m前k的数量
if(s[i]=='K'){
cK++;
}
}for (int i=m+1;i<s.size();i++){
if(s[i]=='P'){
cP++;
}
}
cout<<cK*cP<<endl;
return 0;
}
T6最大的质数
这道题目要求我们求出n以内的最大质数,质数的概念也不需要我多讲什么了。我们就从n开始,循环往下遍历,再写一个判断质数的字函数,只要看到满足条件的数字直接输出就可以了。还有,不要把q给忘记了。
#include <iostream>
using namespace std;
int zhishu(int n){
for(int i=2;i*i<=n;i++){//这里的判断条件一定要用i*i,不然会RE
if(n%i==0){
return 0;
}
}
return 1;
}
int main() {
int q,n;
cin>>q;
for(int i=1;i<=q;i++){
cin>>n;
for(int j=n-1;j>=2;j--){//从n开始,倒着遍历
if(zhishu(j)){
cout<<j<<endl;
break;
}
}
}
return 0;
}
如果上面的题解对你有帮助的话,希望你可以给小编一个大大的关注,大伙的关注就是小编持续更新的最大动力。当然如果大伙对我的题解有什么异议或不解,可以直接私聊我,我也会尽可能地满足宝子们的要求。最后感谢您的耐心观看,我们下期再见~~
以后的题解我会发在A Crowd of MC Lovers中,有需要的宝子们可以加我团队
全部评论 6
冷知识:比赛时每行的最后一个空格,文件的最后一个换行符是不会判定的
2025-03-17 来自 广东
3比方说
1 2 4 4 5 6 6 6 7 7 7
和
1 2 4 4 5 6 6 6 7 7 7
是一样的
2025-03-17 来自 广东
0正规比赛也是一样的
2025-03-17 来自 广东
0
注:最后一道题是n是2-1000000,@AC君,你写成3-1000000了。
2025-03-17 来自 广东
1?数据没问题啊, 就是在 和 之间啊
2025-03-17 来自 广东
0
求求啦!
2025-03-17 来自 浙江
1有帮助的话就点个赞吧
2025-03-17 来自 浙江
1ding
2025-03-22 来自 浙江
0第5题可以DP
2025-03-17 来自 广东
0《DP的正确食用方法》
2025-03-17 来自 云南
0
有帮助,赞一个