非官方全题解 | ACGO欢乐赛#50
2025-06-30 13:32:29
发布于:湖北
先说明一下:本人第一次写全题解,还请各位大佬指点
这次欢乐赛个人难度中等偏下,废话不多说正片开始
官方难度:入门 知识点:输入输出
纯属签到题没啥可说的,直接输出就行了。
C++ Code:
#include <bits/stdc++.h>
using namespace std;
int main(){
cout<<"###.###"<<endl;
cout<<"#...#.#"<<endl;
cout<<"###.#.#"<<endl;
cout<<"..#.#.#"<<endl;
cout<<"###.###"<<endl;
return 0;
}
官方难度:入门 知识点:循环结构
把竖直道路的宽度用sort从小到大排序求出最小值,因为剩余面积与道路的位置无关,所以可以假设水平道路在最上方,竖直道路在最左边,剩余部分为一个长方形,用(行数n-水平道路宽度a)*(列数m-竖直道路宽度)求出剩余面积。
C++ Code:
#include <bits/stdc++.h>
using namespace std;
int b[100005];//好像没给q的数据范围欸
int main(){
int n,m,a,q;
cin>>n>>m>>a>>q;
for (int i=1;i<=q;i++) cin>>b[i];//表示竖直道路的备选宽度
sort(b+1,b+1+q);//排序备选宽度求出最小值
cout<<(n-a)*(m-b[1]);
return 0;
}
官方难度:入门 知识点:循环结构
依题意模拟即可,可以边输入对手的马匹的速度值便判断小明的输赢
C++ Code:
#include <bits/stdc++.h>
using namespace std;
int a[100005],b[100005];
int main(){
int n,score=0;
cin>>n;
for (int i=1;i<=n;i++) cin>>a[i];//小明的马匹的速度值
for (int i=1;i<=n;i++){
cin>>b[i];//对手马匹的速度值
if (a[i]>b[i]) score+=3;//小明赢
else if (a[i]<b[i]) score-=3;//小明输
//平局不拿分,不用进行任何操作
}
cout<<score;
return 0;
}
官方难度:入门 知识点:循环嵌套
用一个数组存每个密码的出现次数,因为每个宝箱的密码互不相同,所以如果一个密码出现次数为n,则这个密码可以解锁全部宝箱。
C++ Code:
#include <bits/stdc++.h>
using namespace std;
int a[100005];//a[i]表示第i个密码的出现次数
int main(){
int n,m,x,ans=0;
cin>>n>>m;
for (int i=1;i<=n;i++){
for (int j=1;j<=m;j++){
cin>>x;//输入第i个宝箱的第j个密码
a[x]++;
}
}
for (int i=1;i<=100000;i++) if (a[i]==n) ans++;//此密码可以解锁全部宝箱
cout<<ans;
return 0;
}
官方难度:入门 知识点:格式化输入输出
这个题目还是要考察亿点数学知识的。
设指针指向12为0°(下同),夹角度数可以表示为 | 时针度数-分针度数 | (如果该度数大于180°,则用360°-该度数) 。注意,这道题中的时针不是在一个小时内一直指着一个数不动的那种,会根据分针移动,所以时针度数为 一大格的度数30°*(小时数+分钟数/60分钟)。分针度数不多说了,就是 一小格的度数6°*分钟数。
C++ Code:
#include <bits/stdc++.h>
using namespace std;
int main(){
double a,b,h,m,d;
cin>>a>>b;
h=30*a+b/2;//时针度数,只不过是上面那个的分配律
m=6*b;//分针度数
d=abs(h-m);//夹角
if (d>180) d=360-d;
printf("%.2lf",d);//两位小数
return 0;
}
官方难度:普及- 知识点:结构体排序
这道题比以上5道题还是难一些的,但也没有多难。
阅读题目,不难发现,一道题目的第i次提交(i>1)和第i-1次提交没有任何的关系(因为通过的时间指的是当前的时间,而不是两次提交的间隔时间),所以遍历每一次提交记录,如果通过了罚时就增加通过的时间,如果没通过罚时就增加15分钟。然后在结构体里存该队的通过题数、罚时和队伍编号,按照题目要求排序就行了。
C++ Code:
#include <bits/stdc++.h>
using namespace std;
struct team{//结构体
int id,ac,pen;//penalty的缩写
}a[105];
int t[30005][5];
bool cmp(team x,team y){//结构体排序
if (x.ac!=y.ac) return x.ac>y.ac;
if (x.pen!=y.pen) return x.pen<y.pen;
return x.id<y.id;
}
int main(){
int n,m;
cin>>n;
for (int i=1;i<=n;i++){
a[i].id=i;
cin>>m;
for (int j=1;j<=m;j++) cin>>t[j][1]>>t[j][2]>>t[j][3];
int pen=0,ac=0;
for (int j=1;j<=m;j++){
if (t[j][3]){//通过
pen+=t[j][1];
ac++;
}
else pen+=15;//未通过
}
a[i].pen=pen;
a[i].ac=ac;
}
sort(a+1,a+1+n,cmp);//排序
for (int i=1;i<=n;i++) cout<<a[i].id<<' ';
return 0;
}
本次全题解结束,再见~
这里空空如也
有帮助,赞一个