洛谷原题

循环,但是要加上一些思维的优化。

暴力

求出居民 \(i\) 与其他居民年龄差的最大值。

看到这里,不难想出 \(O(n^2)\) 的解法。不过会超时,是 AC 不了的。因为数据范围是 \(2 \le N \le 250000\)。我们要进行优化。

优化

题目让我们求居民 \(i\) 与其他居民年龄差的最大值。贪心地想,只要我们找到年龄的最小值和最大值,把距离拉到最大,就是答案。

求最大值和最小值

ma=max(ma,a[i]);
mi=min(mi,a[i]);

使用 \(\max\)\(\min\) 函数可以方便地求出最大值和最小值。

求解

  1. 对于年龄是最大值的居民,要想年龄差最大,就应该取年龄最小的居民的年龄(贪心拉到最大的距离)。
  2. 对于年龄是最小值的居民,要想年龄差最大,就应该取年龄最大的居民的年龄(也是贪心拉到最大的距离)。
  3. 对于年龄既不是最大值也不是最小值的居民,看一看和最大值的差与最小值的差,哪个大,哪个就是答案。
if(a[i]==mi){
    printf("%d\n",ma-mi);//贪心拉开距离
}else if(a[i]==ma){
    printf("%d\n",ma-mi);//同上
}else{
    printf("%d\n",max(a[i]-mi,ma-a[i]));//求更大的年龄差。
}

AC 记录

AC 代码

#include<bits/stdc++.h>
using namespace std;
int a[250005];
int main(){
    int ma=INT_MIN,n,mi=INT_MAX;
    cin>>n;
    for(int i=1; i<=n; i++){
        scanf("%d",&a[i]);
        ma=max(ma,a[i]);
        mi=min(mi,a[i]);
    }
    for(int i=1; i<=n; i++){
        if(a[i]==mi){
            printf("%d\n",ma-mi);//贪心拉开距离
        }else if(a[i]==ma){
            printf("%d\n",ma-mi);//同上
        }else{
            printf("%d\n",max(a[i]-mi,ma-a[i]));//求更大的年龄差。
        }
    }
    return 0;
}
posted on 2026-06-29 21:38  lz5332t  阅读(2)  评论(0)    收藏  举报