1 题意
给N个数,问有多少个无序数对(i,j)(其中,i<j),使得|a[i]-a[j]|达到最大值或者最小值。
2 分析
虽然说是简单题,但是当时一直WA。
注意细节、特判,过程中可能会溢出所以都用long long,以及最重要的是、书写要条理一点。
如
5
1 1 1 1 1
5
1 1 1 2 2
3
#include <iostream>
#include <math.h>
#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
typedef long long ll;
int n;
const int maxn=1e5+10;
ll a[maxn],b[maxn];
ll min_num,max_num;
ll res_min;
ll res_max;
int main()
{
while(~scanf("%d",&n)){
for(int i=0;i<n;i++){
scanf("%lld",&a[i]);
}
sort(a,a+n);
min_num=max_num=1;
res_min=res_max=0;
for(int i=1;i<n;i++){
if(a[i]==a[i-1]){
min_num++;
}
else{
break;
}
}
for(int j=n-2;j>=0;j--){
if(a[j]==a[j+1]){
max_num++;
}
else{
break;
}
}
res_max=(max_num*min_num);
int flag=1;
for(int i=1;i<n;i++){
if(a[i]==a[i-1]){
flag=0;
break;
}
}
if(flag){
for(int i=0;i<n-1;i++){
b[i]=a[i+1]-a[i];
}
sort(b,b+n-1);
res_min=1;
for(int i=1;i<n;i++){
if(b[i]==b[i-1]){
res_min++;
}
else{
break;
}
}
}
else{
long long temp2=1;
res_min=0;
for(int i=1;i<n;i++){
if(a[i]==a[i-1]){
temp2++;
}
else{
if(temp2>1){
res_min+=(temp2)*(temp2-1)/2;
temp2=1;
}
}
}
if(temp2>1){
res_min+=(temp2)*(temp2-1)/2;
temp2=1;
}
}
flag=1;
for(int i=1;i<n;i++){
if(a[i]!=a[i-1]){
flag=0;
break;
}
}
if(flag){
res_max=(long long)((long long)n*(long long)(n-1))/2;
res_min=res_max;
}
cout<<res_min<<" "<<res_max<<endl;
}
}