循环,但是要加上一些思维的优化。
暴力
求出居民 \(i\) 与其他居民年龄差的最大值。
看到这里,不难想出 \(O(n^2)\) 的解法。不过会超时,是 AC 不了的。因为数据范围是 \(2 \le N \le 250000\)。我们要进行优化。
优化
题目让我们求居民 \(i\) 与其他居民年龄差的最大值。贪心地想,只要我们找到年龄的最小值和最大值,把距离拉到最大,就是答案。
求最大值和最小值
ma=max(ma,a[i]);
mi=min(mi,a[i]);
使用 \(\max\) 和 \(\min\) 函数可以方便地求出最大值和最小值。
求解
- 对于年龄是最大值的居民,要想年龄差最大,就应该取年龄最小的居民的年龄(贪心拉到最大的距离)。
- 对于年龄是最小值的居民,要想年龄差最大,就应该取年龄最大的居民的年龄(也是贪心拉到最大的距离)。
- 对于年龄既不是最大值也不是最小值的居民,看一看和最大值的差与最小值的差,哪个大,哪个就是答案。
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 代码
#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;
}
浙公网安备 33010602011771号