直线岛上的来信
原题链接:http://codeforces.com/problemset/problem/567/A
【题目描述】
直线岛是一个很神奇的岛,因为你可以把这个直线岛看成一个横坐标。
在这个岛上有 n 个城市,每个城市都对应一个坐标 xi。
因为这 n 个城市在一条直线上,所以你能够很容易地计算第 i 座城市 和 第 j 座城市的距离就是 |xi-xj| 。
城市之间寄信需要交纳邮费,已知每公里的邮费是一块钱,也就是说,从第 i 座城市寄信到第 j 座城市需要交纳邮费 |xi-xj| 。
聪聪想要知道,对于任意一座城市 i 来说,从城市 i 寄信到其余 n-1 座城市中的任意一座城市 j ,所需要消耗的邮费的最大值和最小值。
【输入格式】
输入的第一行包含一个整数 n (2<=n<=10^5),用于表示直线岛上城市的数量。
接下来一行包含 n 个整数,整数之间用一个空格分隔,用于表示每个城市的坐标 x1,x2,……,xn。(-10^9<=xi<=10^9)
题目保证这n个城市的坐标按照升序排列。
【输出格式】
输出包含 n 行。第 i 行包含两个整数,以一个空格分隔,分别表示从第i座城市寄信到其余n-1座城市中任意一座花费的邮费的最小值和最大值。
【样例输入1】
4
-5 -2 2 7
【样例输出1】
3 12
3 9
4 7
5 12
【样例输入2】
2
-1 1
【样例输出2】
2 2
2 2
【题目分析】
因为题目已经告诉我们城市的坐标是升序的。所以:
对于第1座城市来说,邮费的最小值就是寄到第2座城市的邮费,最大值就是寄到第n座城市的邮费;
对于第n座城市来说,邮费的最小值就是寄到第n-1座城市的邮费,最大值就是寄到第1座城市的邮费;
对于其它任意一座城市i来说,邮费的最小值是min(a[i+1]-a[i],a[i]-a[i-1]),邮费的最大值是max(a[i]-a[1],a[n]-a[i]) 。
实现代码如下:
#include <bits/stdc++.h> using namespace std; const int maxn = 100010; int n, a[maxn], minn, maxx; int main() { cin >> n; for (int i = 0; i < n; i ++) cin >> a[i]; for (int i = 0; i < n; i ++) { if (i == 0) { minn = a[1] - a[0]; maxx = a[n-1] - a[0]; } else if (i == n-1) { minn = a[n-1] - a[n-2]; maxx = a[n-1] - a[0]; } else { minn = min(a[i] - a[i-1], a[i+1] - a[i]); maxx = max(a[n-1] - a[i], a[i] - a[0]); } cout << minn << " " << maxx << endl; } return 0; }