博主:@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的水题大赛解析相关推荐

  1. CYJian的水题大赛[第二弹] U34202 JerryC Loves Driving

    开long long 开long long 开long long !!! 太有可能爆int了 事实证明用程序打表又快又对又整洁 自己手写的表太小,写的不"整齐" 看不出什么来 用程 ...

  2. 【DP】洛谷公开赛 CYJian的水题大赛 T1 八百标兵奔北坡

    题目链接 https://www.luogu.org/problemnew/show/U30363 题目大意 给定每个点的高度,求出每个点与离他最近的高于周围点高度的点(即山)之间的切比雪夫距离 解题 ...

  3. c语言奥林匹克大赛真题,全球首发!1-58届国际数学奥林匹克真题及解析大合集,350道必刷、必看、必收藏的巅峰之题与巧解妙解......

    在数学竞赛的江湖中, 被无数人称为解题大师的单墫教授曾说:"学数学的目的,就是为了学会解题,在这个过程中,去巩固所学的知识,提高能力,更好更多的去掌握数学的内容.意义和方法, 而这个过程很重 ...

  4. 上海交通大学python期末考试样题加解析_上海交通大学python期末考试样题加解析...

    <上海交通大学python期末考试样题加解析>由会员分享,可在线阅读,更多相关<上海交通大学python期末考试样题加解析(7页珍藏版)>请在人人文库网上搜索. 1.升够上伙归 ...

  5. 2023美国大学生数学建模竞赛Y题思路解析

    如下为美赛春季赛Y题思路解析: Problem Y: Understanding Used Sailboat Prices 像许多奢侈品一样,帆船的价值随着它们的年龄和市场状况的变化而变化.所附的&q ...

  6. 2017年第八届蓝桥杯C/C++ B组省赛历年真题及解析

    默认阅读的你具备c/c++基本语法,作者对每一题点明需要掌握的算法策略或思想,并进行简单注释解释: 该博客的正确食用方式:简单了解点明的算法思想和策略,再自行思索之后自己写代码,提交不过再看看别人的代 ...

  7. 杭电acm 4823Energy Conversion(水题)

    Energy Conversion Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others ...

  8. [双指针] aw3333. K-优字符串(双指针+水题)

    文章目录 1. 题目来源 2. 题目解析 1. 题目来源 链接:3333. K-优字符串 2. 题目解析 双指针水题. 可发现首尾对应位置均独立,且得分可以任意变换.故仅需统计初始得分 sum,最小操 ...

  9. 水题/poj 1852 Ants

    1 /* 2 PROBLEM:poj1852 3 AUTHER:Nicole 4 MEMO:水题 5 */ 6 #include<cstdio> 7 using namespace std ...

最新文章

  1. 做 SQL 性能优化真是让人干瞪眼
  2. 1分钟破5亿,华为Mate 30系列抢疯了!
  3. 拓端tecdat|R语言逻辑回归、Naive Bayes贝叶斯、决策树、随机森林算法预测心脏病
  4. 2020 cr节目源_2020/8月最新IPTV M3U8直播源分享
  5. C专家编程(学习笔记)_第10章 再论指针
  6. case when的几种用法
  7. 数学建模写作指导20篇(二)-数学建模论文写作通用模板
  8. SVD奇异值分解在推荐系统中的应用及实现
  9. js打开新窗口并最大化
  10. linux服务器输入法,linux中如何安装和切换输入法
  11. android中RecyclerView添加下划线
  12. 给自己定个小目标:利用python进行数据分析
  13. 服务器2016安装系统教材,Windows Server 2016 正式版安装教程
  14. python sphinx_Python Sphinx使用踩坑记录
  15. java线程高并发编程
  16. 堪比N6705和Power Monitor AAA10F 的高精度_高采样率_低功耗测试电源mPower1203
  17. 【tableau】4个基本图表
  18. 利用IPv6实现公网访问远程桌面
  19. Mockito 之 verify 使用方法
  20. P1941 [NOIP2014 提高组] 飞扬的小鸟

热门文章

  1. Linux 进程优先级 NICE、PRI
  2. 基于GUI的简易图像处理系统设计与实现
  3. nvivo怎么处理访谈记录_Java自然语言处理-第二版:书评和访谈
  4. 【笔记3-6】CS224N课程笔记 - RNN和语言模型
  5. (ssl1232)雷达覆盖(normal)
  6. 804半导体物理 中科院半导体所考研经验
  7. 如何使用python编程解决生活中的问题-日常工作问题处理中Python程序的运用
  8. 项目进度管理的算法总结
  9. win7 使用mklink瘦身C盘空间
  10. matlab2010a在mbuild时找不到vs2010的解决办法