XJOI一级二段题解(g++,即C++),也可视作C++算法竞赛教程

这篇博客介绍了C++在算法竞赛中的应用,包括曼哈顿距离、切比雪夫距离、开根号、直角三角形计算以及四舍五入问题的解法。讲解了数轴与平面直角坐标系的概念,数轴上两点的距离公式,以及abs()、max()、sqrt()、floor()等函数的用法。同时涉及浮点数运算、强制类型转换、比较操作符等基础知识。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

Problem 8359 曼哈顿距离

一 题目内容

二 新知识点

2.1 数轴与平面直角坐标系

2.2 数轴上两点的距离公式

2.3 abs()的用法

三 思路

四 AC代码

Problem 8360 切比雪夫距离

一 题目内容

 二 新知识点

2.1 max(x,y)的用法

三 思路

四 AC代码

Problem 3541 开根号

一 题目内容

二 新知识点

2.1 浮点数及其运算

2.2 sqrt(x)的用法

2.3 floor(x)的用法

三 思路

四 AC代码

Problem 9211 直角三角形

一 题目内容

二 新知识点

2.1 勾股定理

2.2 强制类型转换

三 思路

四 AC代码

Problem 3291 四舍五入

一 题目内容

二 新知识点

2.1 if语句

2.2 if-else语句

2.3 布尔值

2.4 比较操作符(int类型与double类型)

三 思路

四 AC代码

Problem 9878 大力水手波派

一 题目内容

二 新知识点

三 思路

四 AC代码


Problem 8359 曼哈顿距离

一 题目内容

时间:0.2s  空间:32M

题目描述:

小C来到了繁华的曼哈顿,想去参观大都会艺术博物馆!

曼哈顿的道路可以看做是与x轴或y轴垂直的直线,小C位于(a,b),而目的地位于(c,d),问最少几步可以到达。

输入格式:

四个整数,a,b,c,d。坐标为(a,b)与(c,d)

输出格式:

输出这两个点的曼哈顿距离。

样例输入:

0 0 3 4

样例输出:

7

约定:

0<=a,b,c,d<=100

二 新知识点

2.1 数轴与平面直角坐标系

警告 大段概念来袭

一条直线,若规定了它的原点、正方向和单位长度,就可称之为数轴。两条互相垂直的数轴,移动它们的原点,直到两原点重合,就形成了一个平面直角坐标系(如图所示)。

如图,两个重合的原点被称为该坐标系的原点,一般我们规定一个平面直角坐标系由一根铅直的数轴和水平的数轴组成,铅直的数轴一般叫“y轴”,水平的数轴一般叫“x轴”。在实际应用中,可以调整两轴的正方向。

若x轴的正方向朝右,y轴的正方向朝上,则右上角的区域叫“第一象限”,左上角的区域叫“第二象限”,左下角的区域叫“第三象限”,左上角的区域叫“第四象限”。四个象限按一-->二-->三-->四的顺序成逆时针排序。规定两坐标轴不属于任何象限

平面直角坐标系中,过一个点作x轴和y轴的平行线(若其在x轴或y轴上,则无需作该轴的平行线),将其看做数轴(原点相应地平移),则该点在平行于x轴上的对应点表示的数字叫做这个点的横坐标,在平行于y轴上的对应点表示的数字叫做这个点的纵坐标。该点在直角坐标系中的位置标示为“(横坐标,纵坐标)”。

2.2 数轴上两点的距离公式

设数轴上有AB两点,分别表示数ab。若a= b,显然,两点的距离为0;若a> b,则两点的距离为a-b;若a<b,则两点的距离为b-a。注意到距离总是非负数,因此AB两点的距离可用公式\left | a-b \right |表示。

2.3 abs()的用法

在C++中,可用abs(x)求数x的绝对值。

三 思路

数轴上两点的距离公式用在曼哈顿距离上,就是:

(1)先输入两点的坐标(a,b)(c,d)

(2)先求横坐标的距离,为\left | a-c \right |

(3)再求纵坐标的距离,为\left | b-d \right |

(4)把两式相加(即\left | a-c \right |+\left | b-d \right |),求得结果。

四 AC代码

#include<bits/stdc++.h>
using namespace std;
int main(){
    int a,b,c,d;
    cin>>a>>b>>c>>d;
    cout<<abs(a-c)+abs(b-d);
    return 0;
}

Problem 8360 切比雪夫距离

一 题目内容

时限: 0.2s  内存限制: 32M

题目描述:

小C有一个平面!

他在平面上找到两个点。 请求出它们之间的切比雪夫距离。

切比雪夫距离被定义为该点与 X 轴和 Y 轴坐标差的绝对值中较大的一个。

输入格式:

四个整数,a,b,c,d。 坐标是 (a, b) 和 (c, d)

输出格式:

输出这两点的切比雪夫距离。

样例输入:

0 0 3 4

样例输出:

4

约定:

0<=a, b, c, d<=100

 二 新知识点

2.1 max(x,y)的用法

在C++中,可用max(x,y)求两数x,y中较大的那个(两数相等则返回这个相等的数)。

三 思路

综合使用max(x,y)与abs(x),直接根据题意求出结果。

四 AC代码

#include<bits/stdc++.h>
using namespace std;
int main(){
    int a,b,c,d;
    cin>>a>>b>>c>>d;
    cout<<max(abs(a-c),abs(b-d));
    return 0;
}

Problem 3541 开根号

一 题目内容

时间:0.2s   空间:32M

题目描述:

输入一个整数, 求它的平方根,输出答案向下取整.

比如\sqrt{5}=2\sqrt{16}=4

输入格式:

输入一个整数

输出格式:

输出一个整数

样例输入1:

5

样例输出1:

2

样例输入2:

16

样例输出2:

4

约定:

1 \leq n \leq 100000

二 新知识点

2.1 浮点数及其运算

浮点数有float与double两种,double的精确度比float高。其运算规则与int类型基本相同。

2.2 sqrt(x)的用法

用sqrt(x)可求一个数x的平方根的精确值(即double类型的数)

2.3 floor(x)的用法

用floor(x)可求不大于一个数x的最大整数。

三 思路

综合运用floor(x)与sqrt(x),求出结果。

四 AC代码

#include<bits/stdc++.h>
using namespace std;
int main(){
    int a;
    cin>>a;
    cout<<floor(sqrt(a));
}

Problem 9211 直角三角形

一 题目内容

时间:0.2   空间:32M

题目描述:

给出一个直角三角形的两条直角边,问斜边长度。保证三条边长都为整数。

输入格式:

一行两个不超过1000的正整数,表示直角三角形的两直角边长度。

输出格式:

一行一个整数,表示直角三角形的斜边长度。

样例输入:

3 4

样例输出:

5

二 新知识点

2.1 勾股定理

如图,设直角三角形的两条直角边为ab,斜边为c,则三角形的面积S=\frac{ab}{2}

把四个这样的直角三角形拼成左图,则显然S_5区域是一个正方形,S_1=S_2=S_3=S_4=S=\frac{ab}{2}。则大正方形的面积为(设a \geq b,若a=b,则S_5=0):

S_1+S_2+S_3+S_4+S_5

=4S+S_5

=4 \times \frac{ab}{2}+(b-a)^2

=2ab+b^2-2ab+a^2

=a^2+b^2

又因为斜边为c,因此大正方形的面积也可表示为c^2。于是a^2+b^2=c^2

由此,我们得出:在直角三角形中,直角边长的平方和等于斜边的平方。

也即:a^2+b^2=c^2(设两直角边分别为ab,斜边为c)。

2.2 强制类型转换

有时,我们会遇到明明需要int类型的数,可出来的却是个double类型的数。这时就需要强制把double类型的数转换成int类型的数。

可用下列两种方式来转换:

double x;
int y;
cin>>x;
//第一种
y=int(x);
//第二种
y=(int)x;

对于int类型的数,还可使用该数与double类型的数进行运算,即可转换成double类型。如:

a+=1.000000; //修改了a的值
a*=1.0; //没有修改a的值

当然,上面y=(int)x只能用于直接转换,下列代码:

y=(int)x+1.000000;

 就可能会出错。因为(int)x只是把x变成了int类型,再加一个double类型的数,反而会将其变回double类型。

要注意的是,如果要求int类型数除法的精确值,需将其转为double类型。

三 思路

知道勾股定理后,直接应用即可。因为题中说“保证三条边长都为整数”,所以可以运用强制类型转换把double类型换成int类型。

四 AC代码

#include<bits/stdc++.h>
using namespace std;
int main(){
    int a,b;
    cin>>a>>b;
    cout<<int(sqrt(a*a+b*b));
    return 0;
}

Problem 3291 四舍五入

一 题目内容

时间:0.2s   空间:32M

题目描述:

将一个整数,四舍五入到十位

12344->12340

12345->12350

12399->12400

不可以使用系统已有的函数比如 round 等。

输入格式:

输入一个整数

输出格式:

输出一个整数n

样例输入:

99

样例输出:

100

约定:

0 \leq n \leq 10^9

二 新知识点

2.1 if语句

C++中的条件判断可用if语句实现,格式如下:

if(条件){
    //此处写代码
}

这时,只有当条件满足时,里面的代码才会被执行。

2.2 if-else语句

C++中,为实现“如果......那么......否则......”的功能,会用到if-else语句,格式如下:

if(条件){
    //代码1
}else{
    //代码2
}

这时,当条件满足时,代码1被执行。不满足时,代码2被执行。

2.3 布尔值

布尔值用来表示一个语句的真假,只有true和false两个值,true表示真,false表示假。

定义布尔类型变量的语句如下:

bool a=true; //表示把a的值设为真
bool b=false; //表示把b的值设为假

2.4 比较操作符(int类型与double类型)

对于int与double类型的数,可以用比较操作符进行大小比较,常用的有:

符号意义(返回true的情况)
==两数相等
!=两数不相等
>左边的数大于右边的数
<左边的数小于右边的数
>=左边的数大于或等于右边的数
<=左边的数小于或等于右边的数

三 思路

可以用if-else语句模拟四舍五入到十位的过程(若个位小于5,则不进位;否则进位)。

四 AC代码

#include<bits/stdc++.h>
using namespace std;
int main(){
    int a;
    cin>>a;
    if(a%10>=5){
        cout<<(a/10+1)*10;
    }else{
        cout<<a/10*10;
    }
}

Problem 9878 大力水手波派

一 题目内容

时间:1s   空间:256M

题目描述

   相信大家一定听过大力水手波派的故事。每当危急关头,波派就会拿出他的秘密武器——菠菜!吃了菠菜的波派会变得力大无穷,天下无敌!(波派每吃1g菠菜,就能增长1kg的力气。)

   有一天,五个不同国家的大力士同时向波派发出了挑战书。由于五个国家之间路途遥远,波派决定挑选一个最强的对手,去往他所在的国家迎接挑战!在收拾行囊时,波派犯了难,请问他应该准备至少多少克的菠菜,才能保证他一定能击败对手?(规定1、波派初始力气一定小于力气最大的大力士;2、只有力气比对手大,才算击败;3、力气为整数)

输入格式

6个整数a,b,c,d,e,f,分别表示波派和五名大力士的力气,单位为千克。

输出格式

一个整数,表示波派要带的菠菜,单位为克。

样例输入

100 23 41 120 56 93

样例输出

21

约定

0 \leq abcdef \leq 1000

数据保证a \leq max(b,c,d,e,f)

二 新知识点

本题没有新知识点。

三 思路

连续使用max(x,y)求出max(b,c,d,e,f)后,减去a再加上1(因为要使波派的力气大于剩下五个人的力气)即可求出结果。

四 AC代码

#include<bits/stdc++.h>
using namespace std;
int main(){
    int a,b,c,d,e,f;
    cin>>a>>b>>c>>d>>e>>f;
    cout<<max(b,max(c,max(d,max(e,f))))-a+1;
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值