注意老师的查重系统鸭
Problem B. 绕钉子的长绳子
时间限制 1000 ms
内存限制 128 MB
题目描述
求出绳子的长度
输入数据
第 1 行两个数:整数 N (1≤ N≤ 100) 和实数 R 。R表示圆柱的半径
接下来 N 行按逆时针顺序给出 N 个钉子中心的坐标
坐标的绝对值不超过100。
输出数据
一个数,绳子的长度,精确到小数点后 2 位。
样例输入
4 1
0.0 0.0
2.0 0.0
2.0 2.0
0.0 2.0
样例输出
14.28
样例说明
如果你用比较复杂的方法AC了,请想一想有没有更加简便的方法。
分析:实际就是求各点之间的距离加上圆的半径
// Author : 农村娃的成长之路
// Time : 2019/9/26 23:52
// File : RopeLength.java
// Describe : 求绕钉子绳子的长度
// IDE : IntelliJ IDEA
import java.util.ArrayList;
import java.util.Scanner;
public class RopeLength {
public static double GetDistance(double n, double x, double m, double y) {
return Math.sqrt((n - x) * (n - x) + (m - y) * (m - y));
}
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int N = in.nextInt();
double R = in.nextDouble();
double sum = 0.0;
in.nextLine();
ArrayList Origin_list = new ArrayList();
String str = in.nextLine();
String arr[] = str.split(" ");
Origin_list.add(arr[0]);//原点坐标
Origin_list.add(arr[1]);
double x = Double.parseDouble(Origin_list.get(0).toString());
double y = Double.parseDouble(Origin_list.get(1).toString());
for (int i = 0; i < N - 1; i++) {
String STR = in.nextLine();
String ARR[] = STR.split(" ");//输入的新的坐标
sum += GetDistance(Double.valueOf(ARR[1]), Double.parseDouble(Origin_list.get(1).toString()), Double.valueOf(ARR[0]), Double.parseDouble(Origin_list.get(0).toString()));
//更新坐标
Origin_list.set(0, Double.valueOf(ARR[0]));
Origin_list.set(1, Double.valueOf(ARR[1]));
}
//加上终点和原点以及圆柱周长
System.out.printf("%.2f\n", sum + 2 * Math.PI*R + GetDistance(Double.parseDouble(Origin_list.get(0).toString()), x, Double.parseDouble(Origin_list.get(1).toString()), y));
in.close();
}
}