OCAC暑期比赛第二场 F题 直线岛上的来信 题解

直线岛上的来信
原题链接: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;
}

猜你喜欢

转载自www.cnblogs.com/ocac/p/11131655.html
今日推荐