0%

AtCoder Beginner Contest 198 C题(浮点型精度处理)

题目链接

题意:每一步可以走 $r$ 的距离,问到终点至少走多少步

因为两个$r$可以组成 $ (0, 2 \times r) $ 的范围的距离

当距离小于 $ 2r $ 时 如果不等于 $r $,答案就是$ 2r $, 当距离大于$2r$ 时,答案就是

$$ \lceil \frac{dis}{r} \rceil $$

注意浮点型精度问题

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
typedef long long ll;

const double eps = 1e-8;

ll r, x, y;

int sgn(int x) {
if(fabs(x) <= eps) {
return 0;
} else if(x < 0) {
return -1;
}
return 1;
}

int main() {
cin >> r >> x >> y;
double dis = sqrt(x*x + y*y);
int ans = ceil(dis / r);
//首先处理小于直径的情况,两个r可以组成(0, 2*r) 范围
if(sgn(dis - (double)r) == 0) {
puts("1");
} else if(sgn(dis - 2.0*r) == -1) {
puts("2");
} else {
printf("%lld\n", ans);
}

return 0;
}
求大佬赏个饭