有趣的数字

题目链接
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;
}

猜你喜欢

转载自blog.csdn.net/YQMind/article/details/85764305