题目:有n个人相互访问访问各自的坐标,所有道路正交,沿直线行走,求平均路程。
解析:首先对x,y分别进行排序。每个x[i + 1] – x[i] 会经过 (i + 1) * (n – (i + 1)) * 2次,y也一样,然后进入循环进行计算。
代码及精度问题:使用long long int,不要使用int,在测试样例中会超出int范围。计算过程中加入long long temp;避免在计算过程中强制类型转换造成计算错误。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
#include<iostream> #include<algorithm> using namespace std; int main() { int n; cin >> n; int x[100000], y[100000]; for (int i = 0; i < n; i++) cin >> x[i] >> y[i]; long long int sum = 0; sort(x, x + n); sort(y, y + n); for (int i = 0; i < n - 1; i++) { long long temp; temp = x[i + 1] - x[i] + y[i + 1] - y[i]; temp *= i + 1; temp *= n - i - 1; sum += temp * 2; } cout << sum / n / (n - 1) << endl; return 0; } |