ACGO欢乐赛题解#45
2025-04-16 12:04:15
发布于:浙江
喀喀(施法前摇)
不是吧阿sir!
就这比赛难度,确定不是来搞笑的?
不过考虑到主办方说 “欢乐赛是面向刚学语法的选手,难度方面希望大家谅解”,
不然我真以为主办方把我们当小学生哄了!
我当时看到这难度,内心 OS:这也太离谱了,简直是在侮辱我的智商。
什么“算式输出”“最后期限”什么“球体体积”
不过土鸡瓦犬尔!!!!!!!!!
分分钟就《ALL KILL》了
现在青铜局的分都这么好上吗???
我知道,欢乐赛嘛,放点水题也正常。
但是AC官方放三道纯水也太过了吧!!!
以后再放这么多水题,建议再开一个赛,名字都想好了
就叫水题赛吧!!!!!!
什么?你查我战绩发现我根本没考?我用小号考的,大号已经不吃排位分了
喷归喷,闹归闹,题解我还是要发的
T1 算式输出
无力吐槽,就看这题目,简单a+b(还是没有输入的)
#include<iostream>
using namespace std;
int main(){
cout<<"2025*410="<<2025*410;
return 0;
}
唯一要给小萌新提一嘴的是用" "括起来的是字符串,cout是可以直接输出算式结果的
T2 最后期限
也是一道水题,我真的不想喷了,只要知道一小时等于60分钟,小学生都做得出来
#include<bits/stdc++.h>
using namespace std;
int main(){
int a,b,c;cin>>a>>b>>c;
int t=a+b+c+5;
int e=8*60+15;
int s=e-t;
int h=s/60;
int m=s%60;
cout<<h<<" "<<m<<endl;
return 0;
}
T3 球体体积
这道题比T2都简单,照着公式打就可以了。
#include<iostream>
using namespace std;
int main(){
float r;cin>>r;
printf("%.4f",r*r*r/3*4*3.1415926);
return 0;
}
考虑到小萌新的感受,我就讲一下这道题的“难点”printf的食用方法:
printf的具体格式是 printf("%变量类型%……",输出内容,……)
一个printf函数可以像cout一样输出多个元素
像常见的变量类型有:
%d | %f | %c |
---|---|---|
整型 | 浮点型 | 字符型 |
“ ”里的变量类型和你之后的输出内容是一一对应的。
比如说:printf("%d%f",3.14,3.14)输出结果就是3 3.140000,因为第一个3.14对应%d的整型变量,第二个3.14对应%f浮点型变量
但是如果printf的功能只是这样,那还不如cout省事,但是printf的强大之处在于它可以定义输出格式
在 %f 的中间,可以加入 .x,x是要保留小数位数,这样就可以保留4位小数了
T4 分数查询
我,A MC Locer,作为一个编程科技树点歪了的初中生,励志于缩减代码,这道题要我们输入一串字符,然后输出字符串后的内容。因此,我重磅推荐一个函数:unordered_map
食用方法:和vector相似,但是多了一个类似门牌号的东西。
定义:unordered_map<门牌变量类型,内容类型>变量名;
访问方式:变量名[门牌]。
这个函数和结构体是兼容的。
#include<bits/stdc++.h>
using namespace std;
struct AC{//结构体的定义
int c,m,e;
};
int main(){
int n;cin>>n;
unordered_map<string,AC>s;//变量的定义
for(int i=0;i<n;i++){
string t;int c,m,e;
cin>>t>>c>>m>>e;
s[t]={c,m,e};//变量的赋值
}
int q;cin>>q;
for(int i=0;i<q;i++){
string t;cin>>t;
cout<<s[t].c<<" "<<s[t].m<<" "<<s[t].e<<endl;//变量的访问
}
return 0;
}
T5 奖品分发
这道题我将会具体讲解sort函数的正确用法
像这样的题,他的排序方式被重新定义过了。其实sort的排序方式也是可以定义的
函数使用:sort(开始节点,结束节点,排序子函数)
其中,bool类型的子函数可打可不打。如果不打,那么排序内容就会被升序排列。如果打,那么排序内容就会按照子函数所定义的排序方式排序。
下面就是一个样例:
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
bool compare(int a, int b) {
return a > b;
}
int main() {
vector<int> vec = {3, 7, 1, 9, 4};
std::sort(vec.begin(), vec.end(), compare);//主要看这行代码,下面是输出
for (int num : vec) {
cout << num << " ";
}
return 0;
}
我们再看回题目,题目中说有三个排序规则:
①进步的同学优先
②成绩高的优先
③学号小的优先
那我们就可以把compare子函数定义成这样:
struct S{
int a,b,c;
};
bool cmp(const S&A,const S&B){
if(A.c!=B.c)return A.c>B.c;//进步优先
if(A.b!=B.b)return A.b>B.b;//成绩优先
return A.a<B.a;//学号
}
之后就剩下输入输出了,这就不需要我教了吧。下面是完整代码
#include<bits/stdc++.h>
using namespace std;
struct S{
int a,b,c;
};
bool cmp(const S&A,const S&B){
if(A.c!=B.c)return A.c>B.c;
if(A.b!=B.b)return A.b>B.b;
return A.a<B.a;
}
int main(){
int n;cin>>n;vector<S>v(n);
for(int i=0;i<n;i++)cin>>v[i].a>>v[i].b>>v[i].c;
sort(v.begin(),v.end(),cmp);
for(int i=0;i<n;i++)cout<<v[i].a<<endl;
return 0;
}
T6 方阵排列
这道题更是 阿米诺斯 昂,直接模拟就行了
唯一要注意的是逆时针和顺时针不要搞混了,还有对圈数的统计
#include<bits/stdc++.h>
using namespace std;
int a[110][110],n,cnt=1,l=1,c=1;
int main(){
cin>>n;
while(l<=(n+1)/2){
int a1=l,b1=n-l+1,c1=l,d1=n-l+1;
if(c%2==1){
for(int j=a1;j<=b1;j++)a[c1][j]=cnt++;
for(int i=c1+1;i<=d1;i++)a[i][b1]=cnt++;
for(int j=b1-1;j>=a1;j--)a[d1][j]=cnt++;
for(int i=d1-1;i>c1;i--)a[i][a1]=cnt++;
}else{
for(int i=c1;i<=d1;i++)a[i][a1]=cnt++;
for(int j=a1+1;j<=b1;j++)a[d1][j]=cnt++;
for(int i=d1-1;i>=c1;i--)a[i][b1]=cnt++;
for(int j=b1-1;j>a1;j--)a[c1][j]=cnt++;
}
l++;c++;
}
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
cout<<a[i][j]<<" ";
}
cout<<endl;
}
return 0;
}
加我团队:A Crowd of MC Lovers
如果上面的题解对你有帮助的话,希望你可以给小编 一 键 三 连 (点赞关注加团队),大伙的关注就是小编持续更新的最大动力。当然如果大伙对我的题解有什么异议或不解,可以直接私聊我,我也会尽可能地满足宝子们的要求。最后感谢您的耐心观看,我们下期再见~~
全部评论 2
ding
2天前 来自 浙江
0ding
3天前 来自 浙江
0
有帮助,赞一个