题目链接
https://www.nowcoder.com/questionTerminal/af709ab9ca57430886632022e543d4c6
小Q今天在上厕所时想到了这个问题:有n个数,两两组成二元组,相差最小的有多少对呢?相差最大呢?
考虑不到的是 当出现重复数字的时候,差值最大和最小的对数计算问题。
#include <iostream>
#include <algorithm>
using namespace std;
int main(){
int n;
while(cin>>n){
int A[n];
for(int i=0;i<n;i++)
cin>>A[i];
sort(A,A+n);
int a = 0, b=0;
if(n>1){
if(A[0]==A[n-1]){ // 所有的数相等
a=b = n*(n-1)/2;
}
else{
// 处理差最小的对数
//先计算最小的值是多少
int minDist=A[1]-A[0];
for(int i=1;i<n-1;i++){
if(A[i+1]-A[i]<minDist)
minDist = A[i+1]-A[i];
}
if(minDist==0){ // 存在重复的数字
int repeatNum;
for(int i=0;i<n;i++){
repeatNum = 1;
while(i+1 <n && A[i+1]==A[i]){
repeatNum++;
i++;
}
a += repeatNum*(repeatNum-1)/2;
}
}else{
for(int i=0;i<n-1;i++){
if(A[i+1]-A[i]==minDist)
a++;
}
}
// 处理差最大的对数
// 统计和A[0]相同的个数 统计和A[n-1]相同的个数
int left = 0, right=0;
for(int i=0;i<n;i++){
if(A[i]==A[0]) left++;
else break;
}
for(int i=n-1;i>=0;i--){
if(A[i]==A[n-1]) right++;
else break;
}
b = left*right;
}
}
cout<<a<<" "<<b<<endl;
}
return 0;
}