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

这篇博客是关于C++算法竞赛的入门教程,讲解了如何处理浮点数精度和输出,包括浮点数除法、欧几里得距离计算、摄氏温度转换等实际问题。通过具体的题目实例,介绍了使用printf()进行标准输出和处理浮点数精度的方法,同时涉及直角坐标平面内两点距离的计算公式。此外,还探讨了如何利用for循环和前加加、后加加操作符进行数值计算。

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

目录

Problem 3567 浮点数

一 题目内容

二 新知识点

2.1 对浮点数精度要求的处理与另一种标准输出

三 思路

四 AC代码

Problem 3572 浮点除法

一 题目内容

二 新知识点

三 思路

四 AC代码

 Problem 8355 欧几里得距离

一 题目内容

二 新知识点

2.1 直角坐标平面内两点的距离公式

三 思路

四 AC代码

Problem 3542 摄氏温度转换

一 题目内容

二 新知识点

三 思路

四 AC代码

Problem 9215 圈地

一 题目内容

二 新知识点

三 思路

四 AC代码

 Problem 9217 吃鸡腿

一 题目内容

二 新知识点

三 思路

四 AC代码

Problem 1129 鸡兔同笼

二 新知识点

2.1 使用标准输出流输出换行符

三 思路

四 AC代码

Problem 3902 分数求和

一 题目内容

二 新知识点

2.1 前加加,后加加,前减减,后减减

2.2 for循环

三 思路

四 AC代码


Problem 3567 浮点数

一 题目内容

时间:0.2s 空间:32M

题目描述:

小鹦鹉正在学习浮点数,你跟他说一个浮点数,他立刻就能学会。

输入一个浮点数,输出这个浮点数。

输入格式:

输入一个浮点数

输出格式:

输出一个浮点数,保留三位小数

样例输入1:

1.123456

样例输出1:

1.123

样例输入2:

1.359578

样例输出2:

1.360

二 新知识点

2.1 对浮点数精度要求的处理与另一种标准输出

本题中,对浮点数的精度有“保留三位小数”的要求。这时,较简便的处理方法是使用printf()。使用它,您可以拼接不同类型的变量,如:

int a=1;
double b=2.1234567;
//使用printf()拼接a和b
printf("%d's type is int, while %.3lf's type is double.",a,b);

输出如下:

1's type is int, while 2.123's type is double.

printf()首先接收一个字符串。字符串中的%d表示整数(int类型),%lf表示浮点数(double类型)。使用“%.xlf”可指定浮点数用四舍五入法保留x位小数输出。

printf()的输出是标准输出,因此可以被OJ网站读取,并且不会因此出现“本地的输出没问题,但在OJ上却报错”的情况。

三 思路

使用cin进行输入,并用printf()进行输出。

四 AC代码

#include<bits/stdc++.h>
using namespace std;
int main(){
    double a;
    cin>>a;
    printf("%.3lf",a);
    return 0;
}

Problem 3572 浮点除法

一 题目内容

时间:0.2s   空间:32M

题目描述:

输入两个整数a, b, 输出a除以b的值,保留三位小数

输入格式:

输入两个整数

输出格式:

输出一个浮点数

样例输入:

5 2

样例输出:

2.500

二 新知识点

本题无新知识点。

三 思路

先直接算除法,再保留3位小数输出。

四 AC代码

#include<bits/stdc++.h>
using namespace std;
int main(){
    int a,b;
    cin>>a>>b;
    printf("%.3lf",1.0*a/b);
    return 0;
}

 Problem 8355 欧几里得距离

一 题目内容

时间:0.2s   空间:32M

题目描述:

小C有一个平面!

它发现了平面上的两个点,请你求出求它们之间的欧几里德距离。欧几里德距离定义为连接这两个点的线段的长度。

答案保留两位小数输出。

输入格式:

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

输出格式:

输出这两个点的欧几里德距离。

样例输入:

0 0 3 4

样例输出:

5.00

约定:

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

二 新知识点

2.1 直角坐标平面内两点的距离公式

如图,在直角坐标平面内有两个点A(x_1,y_1),B(x_2,y_2)。我们可以求出

1.BC=\left | x_1-x_2 \right |

2.AC=\left | y_1-y_2 \right |

由勾股定理,AB两点的距离d=\sqrt{(x_1-y_1)^2+(y_1-y_2)^2}

三 思路

套用两点的距离公式后,保留2位小数输出。

四 AC代码

#include<bits/stdc++.h>
using namespace std;
int main(){
    int a,b,c,d;
    cin>>a>>b>>c>>d;
    printf("%.2lf",sqrt((a-c)*(a-c)+(b-d)*(b-d)));
    return 0;
}

Problem 3542 摄氏温度转换

一 题目内容

时间:0.2s   空间:32M

题目描述:

输入一个浮点数f, 表示华氏温度, 输出对应的摄氏温度c,c=\frac{5}{9}f+32

输入格式:

输入一个浮点数

输出格式:

输出浮点数,保留3位小数

样例输入:

100

样例输出:

37.778

约定:

1\leq f \leq 100000

二 新知识点

本题无新知识点。

三 思路

依题意运算即可。

四 AC代码

#include<bits/stdc++.h>
using namespace std;
int main(){
    double f,c;
    cin>>f;
    c=f*5.0/9.0+32.0;
    printf(".3lf",c);
    return 0;
}

Problem 9215 圈地

一 题目内容

时间:0.2s   空间:32M

题目描述:

小A要在墙角圈一块长方形地,我们认为墙面无限长。现在小A手里只有长度为w的绳子,问最多能圈面积多大的地。保证w为偶数。

输入格式:

一行一个不超过100的正整数,表示绳长。

输出格式:

一行一个整数,表示地的最大面积。

样例输入:

10

样例输出:

25

二 新知识点

本题没有新知识点。

三 思路

 如图,红色为墙,蓝色部分是一个边长为\frac{w}{2}的正方形,黑色部分是一个长为\frac{w}{2}+x,宽为\frac{w}{2}-x的长方形(0<x<\frac{w}{2})。下面证明蓝色部分的面积永远大于黑色部分的面积:

蓝色部分的面积为:(\frac{w}{2})^2=\frac{w^2}{4}

黑色部分的面积为:(\frac{w}{2}+x)(\frac{w}{2}-x)=\frac{w^2}{4}-x^2

\because x>0,\therefore x^2>0,\therefore黑色部分的面积小于蓝色部分的面积。

因此,蓝色部分的面积最大,输出这个面积即可。

又因为w为偶数,所以用int类型存储w不会造成精度丢失(请注意int类型的除法只保留整数部分)。

四 AC代码

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

 Problem 9217 吃鸡腿

一 题目内容

时间:0.2s   空间:32M

题目描述:

小A最喜欢吃鸡腿了。现在,炸鸡腿买三送一了!每只鸡腿a元,小A手中有B元。问小A能吃到多少只鸡腿?

输入格式:

一行两个整数a,B。

输出格式:

一行一个整数,表示答案。

样例输入:

1 7

样例输出:

9

二 新知识点

本题无新知识点。

三 思路

先求出小A能买多少鸡腿,再加上送的鸡腿。

四 AC代码

#include<bits/stdc++.h>
using namespace std;
int main(){
    int a,B;
    cin>>a>>B;
    int num=B/a;
    cout<<num+num/3;
    return 0;
}

Problem 1129 鸡兔同笼

时间:1s  空间:65536K

题目描述:

鸡兔同笼,数数头有x个,数数脚有y只,求鸡和兔各几只?

输入格式:

一行,两个整数x和y。

输出格式: 

两行,第一行是鸡的只数,第二行是兔的只数。

样例输入:
40 100

样例输出:

30
10

二 新知识点

2.1 使用标准输出流输出换行符

可以使用cout按如下方法输出换行符:

//例1
cout<<endl;
//例2
cout<<"1"<<endl<<"2";

对于例1,会输出单独的换行符;对于例2,输出如下:

1
2

三 思路

假设所有动物全为鸡,则共有脚2x只。但所有动物不一定全都是鸡,我们少数了脚(y-2x)只。因为我们少数的脚是属于兔子的,且每只兔子都被少数了2只脚,因此兔子共\frac{y-2x}{2}只。随后即可求出鸡的只数。

四 AC代码

#include<bits/stdc++.h>
using namespace std;
int main(){
    int x,y;
    cin>>x>>y;
    int n=(y-2*x)/2;   //2*x不要写成2x
    cout<<x-n<<endl<<n;
    return 0;
}

Problem 3902 分数求和

一 题目内容

时间:1s   空间:256M

题目描述

S=\frac{1}{2}+\frac{1}{6}+\frac{1}{12}+\frac{1}{20}+\frac{1}{30}+\frac{1}{42}+..., 求S的前n项和,答案保留2位小数

输入格式

一个整数n。 

输出格式

一个浮点数S

样例输入

10

样例输出

0.91

约定

1 \leq n \leq 100

二 新知识点

2.1 前加加,后加加,前减减,后减减

要把一个int型变量x加1,我们会想到如下代码:

x=x+1;

意思是把x的新值设为原来的x值加1。其实,还有两种写法也可以实现这点:

++x; //前加加
x++; //后加加

 其中的++x因为两个加号在前面,因此叫“前加加”;x++同理,叫“后加加”。

同样的,把x减去1也有如下两种写法:

--x; //前减减
x--; //后减减

其中上面一行叫“前减减”,下面一行叫“后减减”。

至于前加加、后加加和前减减、后减减的区别,我们以后遇到了再讲。 

2.2 for循环

我们经常需要让程序做类似的事情,显然打很多遍代码不合算,因此有了for循环,格式如下:

for(数据类型 变量=x;循环继续的条件;每次循环后变量进行的变化){
    //此处写代码
}

三 思路

先寻找规律:

2=1 \times 2

6=2 \times 3

12=3 \times 4

则第n项的分母为n(n+1)

找到规律后即可使用for循环,计算S的值。

四 AC代码

#include<bits/stdc++.h>
using namespace std;
int main(){
    double s=0.0;
    int n;
    cin>>n;
    for(int i=1;i<=n;i++){
        s+=1.0/(i*(i+1));
    }
    printf("%.2lf",s);
    return 0;
}
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值