【非官方题解】欢乐赛#78题解
2026-07-27 20:53:45
发布于:广东
有需要的可以来看
-
皓仔的
- 核心难点:数据类型
- 题意拆解:给出两个实数 ,保留 位小数输出 的结果
- 分步解决:先用
double类型存储 ,计算表达式,最后用printf("%.2lf",ANSWER)或setprecision(2)保留 位小数 - 代码:
#include<bits/stdc++.h> using namespace std; int main() { double w,h; //如果其中之一为int,在#10会WA cin>>h>>w; printf("%.2lf",w/(h*h)); //保留2位小数 return 0; }
-
皓仔的体重等级
- 核心难点: 多
if分支判断、数据类型 - 题意拆解: 也是计算
BMI,只不过划分了四个等级:值 输出 偏瘦 正常 超重 肥胖 - 分步解决: 先按照上题计算
BMI,然后使用多分支判断 - 代码:
#include<bits/stdc++.h> using namespace std; int main() { double w,h,BMI; cin>>h>>w; BMI=w/(h*h); if(BMI<18.5) cout<<"偏瘦"; else if(18.5<=BMI && BMI<24) cout<<"正常"; else if(24<=BMI && BMI<28) cout<<"超重"; else cout<<"肥胖"; //否则BMI>=28 return 0; }
- 核心难点: 多
-
皓仔的字母变换
-
核心难点:字符串遍历、每次增加/减少 时的大小比较、
ASCII的理解 -
题意拆解:给定一个整数 ,按照下面的规则对字符串进行变换:如果字符是大写字母,则在大写字母表中向后移动 位;如果字符是小写字母,则在小写字母表中向前移动 位;其他字符保持不变。
字母移动时,大写字母
Z向后移动 位会变成A,小写字母a向前移动 位会变成z。 -
分步解决:
-
代码:
#include<bits/stdc++.h> using namespace std; int main() { string s; int turn; getline(cin,s); //直接用cin读入会丢失空格后的字符串 cin>>turn; for(char a:s){ if('a'<=a && a<='z'){ if(a-(turn%26)<97) cout<<char(int(a)-(turn%26)+26); //防止减成负数 else cout<<char(int(a)-(turn%26)); //取余是因为当x一大比较会出现错误 }else if('A'<=a && a<='Z'){ if(a+(turn%26)>90) cout<<char(int(a)+(turn%26)-26); //和上同理 else cout<<char(int(a)+(turn%26)); }else cout<<a; //其余字符不变 } }
-
-
皓仔的寻宝之路
- 核心难点: 下标偏移、移动失败处理、位置 偏移
- 题意拆解:给出 个非负整数、皓仔最开始的坐标和移动的路线,计算可获得的宝藏价值。(可重复到达;若移动失败不计入总价值)
- 分步解决:先存储路线,随后根据
L和R移动并将位置的宝藏价值加入总价值 - 代码:
#include<bits/stdc++.h> using namespace std; int main() { int m,x,n,ans=0; cin>>m>>x>>n; string move; vector<int> gold(n); //存储路线 for(int i=0;i<m;i++) cin>>gold[i]; cin>>move; x--; //先让x和下标对齐 for(char a:move){ if(a=='L'){ if(x-1<0) continue; //超出范围不计入 else ans+=gold[--x]; //先减去表示已经左移 //注:--x表示先减1,后赋值给x }else if(a=='R'){ if(x+1>=m) continue; //同上 else ans+=gold[++x]; //先增加表示已经右移 //注:++x表示先加1,后赋值给x } } cout<<ans; }
-
皓仔的数组检测
- 核心难点: 回文数、质数判断
- 题意拆解:给出 个长度为 的数组(下标从 开始),如果该数组所有下标为奇数的数字的总和是一个质数,且该数组所有下标为偶数的数字的总和是一个回文数,那么该数组是合法数组,输出
Yes;否则输出No - 分步解决:先计算出每组数据中数组的奇偶数总和,再逐一判断质数和回文数。(可以使用函数)
- 代码:
#include<bits/stdc++.h> using namespace std; bool is_prime(int n){ //判断质数 if(n<2) return false; if(n==2 || n==3) return true; if(n%2==0) return false; for(int i=3;i*i<=n;i+=2){ if(n%i==0) return false; } return true; } bool is_pal(int n){ //判断回文数 string s=to_string(n),p=s; //把n转成string类型 reverse(s.begin(),s.end()); //原地把s逆转 if(p==s) return true; //p是原来的串,s是更改后的串 else return false; } int main() { int n; cin>>n; for(int i=0;i<n;i++){ int t,bnt=0,tnt=0; cin>>t; for(int i=1;i<=t;i++){ int j; cin>>j; if(i%2==0) bnt+=j; //奇偶分清 else tnt+=j; } if(is_prime(tnt)&&is_pal(bnt)) cout<<"Yes\n"; //两个都成立即为正确 else cout<<"No\n"; } }
-
皓仔的矩阵魔法
- 核心难点:对于左上角、右下角
x1,y1,x2,y2的子矩阵处理、op分支处理、二维动态vector数组 - 题意拆解:对于一个 大小的数字矩阵进行 次操作,每次操作输入六个整数
op,x1,y1,x2,y2,v,op=1时将里的所有数据增加 ;op=2时将里的所有数据减少 ;op=3时将里的所有数据赋值为 - 分步解决:先使用
vector<vector<int>>读入所有数据,随后对于每轮数据进行处理,需要注意的是直接用x1,y1,x2,y2进行操作在边界时会出现RE
(数组越界),需要用x1-1,y1-1,x2-1,y2-1处理 - 代码:
#include<bits/stdc++.h> using namespace std; int main() { int n,m,q; cin>>n>>m>>q; vector<vector<int>> num(n,vector<int>(m)); /*该写法为 二维动态vector数组写法,必须在m那里加上括号,否则会运行错误 */ for(int i=0;i<n;i++){ for(int j=0;j<m;j++){ cin>>num[i][j]; } } for(int k=1;k<=q;k++){ int op,x1,y1,x2,y2,v; cin>>op>>x1>>y1>>x2>>y2>>v; if(op==1){ //第一种操作 for(int i=x1-1;i<x2;i++){ //直接使用x1,x2,y1,y2在边界时会出现RE for(int j=y1-1;j<y2;j++){ num[i][j]+=v; } } }else if(op==2){ for(int i=x1-1;i<x2;i++){ for(int j=y1-1;j<y2;j++){ num[i][j]-=v; } } }else if(op==3){ for(int i=x1-1;i<x2;i++){ for(int j=y1-1;j<y2;j++){ num[i][j]=v; } } } } for(int i=0;i<n;i++){ for(int j=0;j<m;j++){ cout<<num[i][j]<<' '; } cout<<'\n'; //需要换行 } }
- 核心难点:对于左上角、右下角
这里空空如也
















有帮助,赞一个