HQY的水题大赛解析
博主:@DY 我做完了所有题目,说好奖励HQY女朋友的吻呢【手动滑稽】
HQY:曹贼纳命来!!!!(强行屏蔽)
HXY:@XueYunAW 所以说爱会消失,是吗? (掏出了钛合金键盘)
博主:@HXY 开个玩笑,别当真啊! (惨叫&&痛苦面具)
读者: TMD正文怎么还没开始!!!!
. . . . . .
比赛题目列表: 传送阵
文章目录
- NO 1:HQY与手机
- (1)查看题目
- (2)分析题目
- 1.知识点
- 2.方法
- (3)解决问题
- 1.存储字母
- 2.打出对应字母
- 完整代码
- NO 2:HQY和迷宫
- (1)查看题目
- (2)分析题目
- 1.知识点
- 2.方法
- (3)解决问题
- 1.绝对值
- 2.Manhattan距离公式
- 完整代码
- NO 3:HQY与约会
- (1)查看题目
- (2)分析题目
- 1.知识点
- 2.方法
- (3)解决问题
- 1.队列
- 2.处理输入
- 3.BFS输出
- 完整代码
- NO 4:HQY与读数
- (1)查看题目
- (2)分析题目
- 1.知识点
- 2.方法
- (3)解决问题
- 1.初始化
- 2.考虑特殊情况
- 3.一般情况
- 4.输出细节处理
- 完整代码
- 码字不容易,求三连!
NO 1:HQY与手机
(1)查看题目
折跃门
(2)分析题目
1.知识点
不难看出本题考察的是对字符&字符串的操作 (废话)
2.方法
本人使用字符数组存储法
当然方法并不唯一 (废话)
(3)解决问题
1.存储字母
for(int i=0;i<t.size();++i)a[t[i]]=r[i];
2.打出对应字母
for(int i=0;i<s.size();++i)cout<<a[s[i]];
完整代码
#include<bits/stdc++.h>
using namespace std;
char a[1001];//数据范围很小,数组定义的有亿点点浪费
string s,t,r;
int main(){cin>>s>>t>>r;for(int i=0;i<t.size();++i)a[t[i]]=r[i];//强制类型转换,以ASCII码为下标 for(int i=0;i<s.size();++i)cout<<a[s[i]]; return 0;
}
NO 2:HQY和迷宫
(1)查看题目
折跃门
(2)分析题目
1.知识点
Manhattan距离
2.方法
有很多同学看到迷宫类题目就想到搜索,但搜索并不算是一种高效算法,而且本题数据在0~ 1 0 8 10^8 108之间,搜索很不现实。所以要用数论,Manhattan距离,记住公式:Manhattan距离=| x 1 − x 2 x_1-x_2 x1−x2|+| y 1 − y 2 y_1-y_2 y1−y2|.
(3)解决问题
1.绝对值
使用abs()函数,即绝对值,abs(x) = return x>=0?x:-x.
2.Manhattan距离公式
将公式转化为代码:
abs(x[1]-x[2])+abs(y[1]-y[2]);
完整代码
#include<bits/stdc++.h>
using namespace std;
int m,n,x[2],y[2];
int main(){scanf("%d%d%d%d%d%d",&m,&n,&x[1],&y[1],&x[2],&y[2]);//m、n没有任何用 printf("%d",abs(x[1]-x[2])+abs(y[1]-y[2]));//abs()为C++自带的取绝对值函数,运用公式一步到位 return 0;
}
NO 3:HQY与约会
(1)查看题目
折跃门
(2)分析题目
1.知识点
最短路,搜索
2.方法
因为本题数据很小,所以可以直接爆搜,我采取的方法是BFS,当然也可以用DFS。(废话)
(3)解决问题
1.队列
先定义一种数据类型,记下坐标和答案:
struct dker{int x,y,ans;
}h,g,u;
然后构成队列:
queue<dker>q;
附上STL队列的基本用法:
q.push(x)//将x压入队列q的末端q.pop()//弹出队列q的第一个元素(队顶元素),注意此函数并不返回任何值q.front()//返回队列q第一个元素(队顶元素)q.back()//返回队列q最后被压入的元素(队尾元素)q.empty()//当队列队列q为空时,返回trueq.size()//返回队列q的长度
PS:记得加上它的专属头文件#include< queue >或者用万能头文件#include< bits/stdc++.h >并声明using namespace std;(或者在每次关于queue的操作前加上std:: 进行声明)。
2.处理输入
使用 M a p i , j Map_i,_j Mapi,j记录第i行第j列可否通过:
for(int i=0;i<t;++i){scanf("%d%d",&x,&y);Map[x][y]=1;//m大写,防止与STL库中的数据结构map冲突(我用的万能头文件)
}
3.BFS输出
核心BFS代码:
while(!q.empty()){u=q.front();q.pop();if(u.x==g.x&&u.y==g.y){printf("%d",u.ans);//因为BFS是广度优先,所以越快入队的点路径越短return 0;//找到答案直接打出然后结束 }if(Map[u.x+1][u.y]==0&&v[u.x+1][u.y]==0&&u.x<m){//判断路可不可走、是否走过、是否越界 v[u.x+1][u.y]=1;++u.x;++u.ans;q.push(u);--u.x;--u.ans;//加完之后减回来 }if(Map[u.x][u.y+1]==0&&v[u.x][u.y+1]==0&&u.y<n){v[u.x][u.y+1]=1;++u.y;++u.ans;q.push(u);--u.y;--u.ans;//同理,减完之后加回来 }if(Map[u.x-1][u.y]==0&&v[u.x-1][u.y]==0&&u.x>1){v[u.x-1][u.y]=1;--u.x;++u.ans;q.push(u);++u.x;--u.ans;}if(Map[u.x][u.y-1]==0&&v[u.x][u.y-1]==0&&u.y>1){v[u.x][u.y-1]=1;--u.y;++u.ans;q.push(u);++u.y;--u.ans;}//上下左右四个方向
}
最后别忘记考虑无法到达的情况:
printf("HQY lost his love");
完整代码
#include<bits/stdc++.h>
using namespace std;
struct dker{int x,y,ans;
}h,g,u;
int m,n,t,x,y;
bool v[6][6],Map[6][6];//m大写,防止与STL库中的数据结构map冲突(我用的万能头文件)
queue<dker>q;
int main(){scanf("%d%d%d%d%d%d%d",&m,&n,&t,&h.x,&h.y,&g.x,&g.y);for(int i=0;i<t;++i){scanf("%d%d",&x,&y);Map[x][y]=1;}h.ans=0;v[h.x][h.y]=1;q.push(h);while(!q.empty()){u=q.front();q.pop();if(u.x==g.x&&u.y==g.y){printf("%d",u.ans);//因为BFS是广度优先,所以越快入队的点路径越短return 0;//找到答案直接打出然后结束 }if(Map[u.x+1][u.y]==0&&v[u.x+1][u.y]==0&&u.x<m){//判断路可不可走、是否走过、是否越界 v[u.x+1][u.y]=1;++u.x;++u.ans;q.push(u);--u.x;--u.ans;//加完之后减回来 }if(Map[u.x][u.y+1]==0&&v[u.x][u.y+1]==0&&u.y<n){v[u.x][u.y+1]=1;++u.y;++u.ans;q.push(u);--u.y;--u.ans;//同理,减完之后加回来 }if(Map[u.x-1][u.y]==0&&v[u.x-1][u.y]==0&&u.x>1){v[u.x-1][u.y]=1;--u.x;++u.ans;q.push(u);++u.x;--u.ans;}if(Map[u.x][u.y-1]==0&&v[u.x][u.y-1]==0&&u.y>1){v[u.x][u.y-1]=1;--u.y;++u.ans;q.push(u);++u.y;--u.ans;}//上下左右四个方向 }printf("HQY lost his love");//所有可及点没有找到终点,打出搜索失败字符 return 0;
}
NO 4:HQY与读数
(1)查看题目
折跃门
(2)分析题目
1.知识点
数论 (万物皆可当数论)
模拟 (一切都能作模拟)
穷举 (真男人只用穷举)
2.方法
打表 (程序猿的事怎么能叫打表呢?)
穷举
(这道题看似很简单,其实真的做起来细节还是很多的)
(3)解决问题
1.初始化
分类好了什么数组是干嘛用的
int i,j,k;//i:4位数为一组 j:数组str的下标 k:n的最后一位数
char *num[]={"ling","yi","er","san","si","wu","liu","qi","ba","jiu"};//数字
char *wei[]={"shi","bai","qian","wan","yi"};//位
char *s[20];//存结果
2.考虑特殊情况
当时就因为没考虑只有0的情况错了一个点。
if(n==0){cout<<"ling";return 0;
}
3.一般情况
分段处理:
while(n>0){k=n%10;n/=10;if(k>0){if(i>0){if(i>=4&&!l[i/4-1]){//如果是大于等于4位数的数,且已经加了一个wei,那么久不要添加l[i/4-1]=1;s[j++]=wei[i/4+2];}if(i%4!=0)s[j++]=wei[i%4-1];}s[j++]=num[k];}else if(j>0&&s[j-1]!=num[0])//判断连续另个是不是都是0s[j++]=num[0];++i;
}
4.输出细节处理
if(!(s[j-1]=="yi"&&j>1&&s[j-2]=="shi"))//去除yi shi的情况
cout<<s[j-1]<<" ";//输出第一位数
for(i=j-2;i>=0;--i)//输出剩余的各个字符串
cout<<s[i]<<" ";
完整代码
#include<iostream>
using namespace std;
int i,j,k,n,l[2]={0};//i:4位数为一组 j:数组str的下标 k:n的最后一位数
int main(){char *num[]={"ling","yi","er","san","si","wu","liu","qi","ba","jiu"};char *wei[]={"shi","bai","qian","wan","yi"};char *s[20];//存结果cin>>n;if(n==0){cout<<"ling";return 0;}while(n>0){k=n%10;n/=10;if(k>0){if(i>0){if(i>=4&&!l[i/4-1]){//如果是大于等于4位数的数,且已经加了一个wei,那么久不要添加l[i/4-1]=1;s[j++]=wei[i/4+2];}if(i%4!=0)s[j++]=wei[i%4-1];}s[j++]=num[k];}else if(j>0&&s[j-1]!=num[0])//判断连续另个是不是都是0s[j++]=num[0];++i;}if(!(s[j-1]=="yi"&&j>1&&s[j-2]=="shi"))//去除yi shi的情况cout<<s[j-1]<<" ";//输出第一位数for(i=j-2;i>=0;--i)//输出剩余的各个字符串cout<<s[i]<<" ";return 0;
}
码字不容易,求三连!
HQY的水题大赛解析相关推荐
- CYJian的水题大赛[第二弹] U34202 JerryC Loves Driving
开long long 开long long 开long long !!! 太有可能爆int了 事实证明用程序打表又快又对又整洁 自己手写的表太小,写的不"整齐" 看不出什么来 用程 ...
- 【DP】洛谷公开赛 CYJian的水题大赛 T1 八百标兵奔北坡
题目链接 https://www.luogu.org/problemnew/show/U30363 题目大意 给定每个点的高度,求出每个点与离他最近的高于周围点高度的点(即山)之间的切比雪夫距离 解题 ...
- c语言奥林匹克大赛真题,全球首发!1-58届国际数学奥林匹克真题及解析大合集,350道必刷、必看、必收藏的巅峰之题与巧解妙解......
在数学竞赛的江湖中, 被无数人称为解题大师的单墫教授曾说:"学数学的目的,就是为了学会解题,在这个过程中,去巩固所学的知识,提高能力,更好更多的去掌握数学的内容.意义和方法, 而这个过程很重 ...
- 上海交通大学python期末考试样题加解析_上海交通大学python期末考试样题加解析...
<上海交通大学python期末考试样题加解析>由会员分享,可在线阅读,更多相关<上海交通大学python期末考试样题加解析(7页珍藏版)>请在人人文库网上搜索. 1.升够上伙归 ...
- 2023美国大学生数学建模竞赛Y题思路解析
如下为美赛春季赛Y题思路解析: Problem Y: Understanding Used Sailboat Prices 像许多奢侈品一样,帆船的价值随着它们的年龄和市场状况的变化而变化.所附的&q ...
- 2017年第八届蓝桥杯C/C++ B组省赛历年真题及解析
默认阅读的你具备c/c++基本语法,作者对每一题点明需要掌握的算法策略或思想,并进行简单注释解释: 该博客的正确食用方式:简单了解点明的算法思想和策略,再自行思索之后自己写代码,提交不过再看看别人的代 ...
- 杭电acm 4823Energy Conversion(水题)
Energy Conversion Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others ...
- [双指针] aw3333. K-优字符串(双指针+水题)
文章目录 1. 题目来源 2. 题目解析 1. 题目来源 链接:3333. K-优字符串 2. 题目解析 双指针水题. 可发现首尾对应位置均独立,且得分可以任意变换.故仅需统计初始得分 sum,最小操 ...
- 水题/poj 1852 Ants
1 /* 2 PROBLEM:poj1852 3 AUTHER:Nicole 4 MEMO:水题 5 */ 6 #include<cstdio> 7 using namespace std ...
最新文章
- 做 SQL 性能优化真是让人干瞪眼
- 1分钟破5亿,华为Mate 30系列抢疯了!
- 拓端tecdat|R语言逻辑回归、Naive Bayes贝叶斯、决策树、随机森林算法预测心脏病
- 2020 cr节目源_2020/8月最新IPTV M3U8直播源分享
- C专家编程(学习笔记)_第10章 再论指针
- case when的几种用法
- 数学建模写作指导20篇(二)-数学建模论文写作通用模板
- SVD奇异值分解在推荐系统中的应用及实现
- js打开新窗口并最大化
- linux服务器输入法,linux中如何安装和切换输入法
- android中RecyclerView添加下划线
- 给自己定个小目标:利用python进行数据分析
- 服务器2016安装系统教材,Windows Server 2016 正式版安装教程
- python sphinx_Python Sphinx使用踩坑记录
- java线程高并发编程
- 堪比N6705和Power Monitor AAA10F 的高精度_高采样率_低功耗测试电源mPower1203
- 【tableau】4个基本图表
- 利用IPv6实现公网访问远程桌面
- Mockito 之 verify 使用方法
- P1941 [NOIP2014 提高组] 飞扬的小鸟