1. 程式人生 > >騰訊筆試程式設計題--小Q上廁所

騰訊筆試程式設計題--小Q上廁所

題目

小Q今天在上廁所時想到了這個問題:有n個數,兩兩組成二元組,差最小的有多少對呢?差最大呢?

輸入

輸入包含多組測試資料。
對於每組測試資料:
N - 本組測試資料有n個數
a1,a2…an - 需要計算的資料
保證:
1<=N<=100000,0<=ai<=INT_MAX.

輸出

對於每組資料,輸出兩個數,第一個數表示差最小的對數,第二個數表示差最大的對數。

輸入例子:

6
45 12 45 32 5 6

輸出例子:

1 2

思路

先對給定的陣列進行排序,最大差的對數就是陣列最小數的個數乘最大數的個數。最小差的產生對於有序的陣列肯定是相鄰的數產生的,計算出最小差為多少;如果為0,則是相等的數產生了最小差,此時對與陣列的某個數a,計算他前面有多少個和他相等。如果不為0,迴圈計算出相鄰兩個數的差是否為最小差,對應的對數+1;對於為什麼是這樣,自己寫下就知道了。

程式碼實現:

#include <iostream>
#include <queue>
#include <algorithm>
using namespace std;

int find_num(int* a,int n,int val){
    int k=0;
    for(int i=0;i<n;i++){
        if(val == a[i]){
            k++;
        }
    }
    return k;
}

int main(void) {
    int n;
    int a[100010
]; while(cin>>n){ for(int i=0;i<n;i++){ cin>>a[i]; } sort(a,a+n); int l,m,r; int minNum,maxNum; minNum = maxNum = 0; l=find_num(a,n,a[0]); r=find_num(a,n,a[n-1]); maxNum = l*r; int minDiv = a[1
]-a[0]; for(int i=2;i<n;i++){ if(a[i]-a[i-1]<minDiv){ minDiv = a[i]-a[i-1]; } } if(minDiv == 0){ for(int i=1;i<n;i++){ int j=i-1; while(a[j]==a[i] && j>=0){ minNum++; j--; } } } else{ for(int i=1;i<n;i++){ if(a[i]-a[i-1] == minDiv) minNum++; } } cout<<minNum<<" "<<maxNum<<endl; } return 0; }