给定平面上N个点P1, P2, ... PN,将他们按顺序连起来,形成一条折线。
请你求出这条折线的中点坐标。
Input第一行包含一个整数N。 (2 <= N <= 100)
以下N行每行包含两个整数Xi, Yi代表Pi的坐标。(0 <= Xi, Yi <= 10000)
Output输出折线段的中点坐标。坐标保留一位小数。
3 0 0 30 30 40 20Sample Output
20.0 20.0
刚开始死活不知道什么是折线的中点,后来看了样例才感觉应该是到两个端点距离相等的点,所以我先求出整个折线的长度取一半赋给half,在从第一个点开始找,如果当前两个点的距离小于half,那么half-=该距离,如果小于就说明该中点一定在当前两个点之间,所以根据三角函数求出half对应的两边,在根据前一个点和后一个点的位置关系,来决定前一个点的坐标是加上还是减去half对应的长度
#include <bits/stdc++.h>
using namespace std;
const int inf = 110;
int po[inf][2];
int main()
{
int num;
scanf("%d", &num);
double x,y;
double len = 0;
for(int i = 0; i < num; i ++){
scanf("%d %d", &po[i][0], &po[i][1]);
if(i >= 1){
len += sqrt((po[i][0] - po[i - 1][0])* (po[i][0] - po[i - 1][0]) + (po[i][1] - po[i - 1][1]) * (po[i][1] - po[i - 1][1]));
}
}
double half = len / 2.0;
for(int i = 0; i < num - 1; i ++){
double dis = sqrt((po[i][0] - po[i + 1][0]) * (po[i][0] - po[i + 1][0])+(po[i][1] - po[i + 1][1]) * (po[i][1] - po[i + 1][1]));
if(half > dis){
half -= dis;
}else {
double addx,addy;
addx = half * (abs(po[i][0] - po[i + 1][0]) / sqrt((po[i][0] - po[i + 1][0]) * (po[i][0] - po[i + 1][0])+(po[i][1] - po[i + 1][1]) * (po[i][1] - po[i + 1][1])));
addy = half * (abs(po[i][1] - po[i + 1][1]) / sqrt((po[i][0] - po[i + 1][0]) * (po[i][0] - po[i + 1][0])+(po[i][1] - po[i + 1][1]) * (po[i][1] - po[i + 1][1])));
if(po[i + 1][0] < po[i][0]){
x = po[i][0] - addx;
}else x = po[i][0] + addx;
if(po[i + 1][1] < po[i][1]){
y = po[i][1] - addy;
}else y = po[i][1] + addy;
break;
}
}
printf("%.1f %.1f\n",x, y);
return 0;
}