官方题解 | 欢乐赛#56题解
2025-09-21 23:37:11
发布于:浙江
赛纲介绍
本次题目的总体题目难度如下,各位选手可以借此评估一下自身的技术水平。
题目编号 | 题目名称 | 题目难度 |
---|---|---|
T1 | 火眼金睛 | 入门 |
T2 | GCD+LCM | 入门 |
T3 | 蓝图研究 | 入门 |
T4 | 日程表 | 入门 |
T5 | 活动积分 | 普及- |
T6 | 自动批改 | 普及- |
T1 火眼金睛
题目大意
输出题目指定的内容。
题解思路
本题本质为输出语句,但是要注意题目指定内容看起来相似,实际上都是不同的字符。
丨
中文gun |
按位或 │
制表符 _
英文下划线 O
大写字母O 0
数字0 第一个和第四个标准中文晚
第二个和第三个异体字晩
。
这里希望同学们能谨记复制粘贴的方法,题目要求输出指定内容时都使用复制粘贴,避免自己手工输入出现错误。笔试题和编程题都需要仔细阅读题目要求,仔细检查自己的答案是否正确。
参考代码
#include <iostream>
using namespace std;
int main() {
cout<<"丨|ㄧ_O0晚晩晩晚"<<endl;
return 0;
}
T2 GCD+LCM
题目大意
给出两个数,计算它们的最大公因数和最小公倍数。
题解思路
本题的数据较小,可以使用循环枚举的方法,将所有可能的因数都判断一下是否能同时被两个数整除,从大到小找到的第一个公共因数就是最大公因数。这里也可以使用递归的方法通过辗转相除法来求最大公因数。
求出最大公因数后,同样可以用循环枚举的方法枚举其中一个数的倍数,看看是否是另一个数的倍数,从小到大找到的第一个公共倍数就是最小公倍数。这里也可以使用公式的方法计算, 和 的最小公倍数为 ,其中 为 和 的最大公因数。
参考代码
#include <bits/stdc++.h>
using namespace std;
int a,b;
int x,y;
int main() {
cin>>a>>b;
for(int i=a;i>=1;i--){
if(a%i==0&&b%i==0){
x=i;
break;
}
}
y=a*b/x;
cout<<x<<" "<<y<<endl;
return 0;
}
T3 蓝图研究
题目大意
每轮研究的时间为前面研究的总时间加上当前这轮所需的额外时间,要通过前面轮次的研究时间逐步往后算出每一轮的研究时间。
题解思路
本题重点在于将前面的研究时间累积起来并加入到当前轮次的研究时间中,并且注意可能会超出 int
的数据范围。
参考代码
#include <bits/stdc++.h>
using namespace std;
long long ans=0;
long long a[105];
int main() {
int n;
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i];
}
long long num=0;
for(int i=1;i<=n;i++){
num=ans+a[i];
ans=ans+num;
}
cout<<ans<<endl;
return 0;
}
T4 日程表
题目大意
给出 条日程的日期和时间,要求按照时间顺序输出每条日程的日期和时间。
题解思路
本题的数据较小,可以通过循环和分支语句使用变量记录当前最早的日期与时间,输出后将该日程的日期更新为一个较大数表示日程不存在。也可以使用结构体排序的方法,先按照日期排序,日期相同再按照时间排序。
考虑到十月只有 天以及每天只有 小时,可以把日期和时间分别作为二维数组的行号和列号,用二维数组对应位置的元素值表示该时间点的日程数,通过二维数组的顺序遍历来顺序输出日程。
本题要注意同一日期的同一时间可能会存在多个日程,需要多次输出,所以二维数组存储时元素需要记录日程数并通过循环输出对应的次数。
参考代码
#include <bits/stdc++.h>
using namespace std;
int a[35][30];
int main() {
int n;
cin>>n;
for(int i=1;i<=n;i++){
int x,y;
cin>>x>>y;
a[x][y]++;
}
for(int i=1;i<=31;i++){
for(int j=0;j<=23;j++){
while(a[i][j]>0){
cout<<i<<" "<<j<<endl;
a[i][j]--;
}
}
}
return 0;
}
T5 活动积分
题目大意
输入一个字符和两个整数表示活动的类型、标准参与人数和实际参与人数,按照题目中的信息计算对应的活动积分。
题解思路
本题的单人积分上限由活动类型决定,标准参与人数只决定获得的分数是单人积分上限还是需要对总积分进行平分。这里可以用字符的方法先判断活动的类型,再模拟活动的情况,根据人数计算对应的积分。
参考代码
#include <bits/stdc++.h>
using namespace std;
char s;
int x,y;
int main() {
cin>>s;
cin>>x>>y;
int ans=0;
if(s=='A'){
ans=37500;
}
else if(s=='B'){
ans=47500;
}
else if(s=='C'){
ans=49000;
}
else if(s=='D'){
ans=52000;
}
else if(s=='E'){
if(x==10){
ans=80000;
}
else if(x==30){
ans=160000;
}
}
if(y>x){
ans=ans*x/y;
}
cout<<ans<<endl;
return 0;
}
T6 自动批改
题目大意
题目给出字符串表示每位同学的答案,需要与标准答案的字符串进行比较,计算出每位同学的得分,再根据得分进行排名,输出对应的编号与得分。
题解思路
本题本质上是字符串的处理以及结构体的存储与排序,将字符串的下标与本题分数结合,通过分支语句来判断是否与标准答案相同,相同则将本题分数加入到当前同学的总分中。
这里每位同学的答案是键盘输入,但编号是按输入顺序确定的,总分是根据输入计算得到的,要注意结构体中成员变量的使用。
参考代码
#include <bits/stdc++.h>
using namespace std;
int n;
string st;
struct node{
string s;
int id;
double x=0;
}a[55];
bool cmp(node L,node R){
if(L.x==R.x){
return L.id<R.id;
}
else{
return L.x>R.x;
}
}
int main() {
cin>>n;
cin>>st;
for(int i=1;i<=n;i++){
cin>>a[i].s;
a[i].id=i;
for(int j=0;j<st.size();j++){
if(a[i].s[j]==st[j]){
if(j>=15&&j<=18){
a[i].x=a[i].x+1.5;
}
else if(j>=21&&j<=24){
a[i].x=a[i].x+1.5;
}
else if(j>=27&&j<=30){
a[i].x=a[i].x+1.5;
}
else if(j>=33&&j<=36){
a[i].x=a[i].x+1.5;
}
else{
a[i].x=a[i].x+2;
}
}
}
}
sort(a+1,a+n+1,cmp);
for(int i=1;i<=n;i++){
cout<<a[i].id<<" "<<a[i].x<<endl;
}
return 0;
}
这里空空如也
有帮助,赞一个