騰訊筆試題 2 有趣的數字
阿新 • • 發佈:2019-02-04
小Q今天在上廁所時想到了這個問題:有n個數,兩兩組成二元組,差最小的有多少對呢?差最大呢?
輸入描述:
輸入包含多組測試資料。
對於每組測試資料:
N - 本組測試資料有n個數
a1,a2...an - 需要計算的資料
保證:
1<=N<=100000,0<=ai<=INT_MAX.
輸出描述:
對於每組資料,輸出兩個數,第一個數表示差最小的對數,第二個數表示差最大的對數。
輸入例子1:
6
45 12 45 32 5 6
輸出例子1:
輸入描述:
輸入包含多組測試資料。
對於每組測試資料:
N - 本組測試資料有n個數
a1,a2...an - 需要計算的資料
保證:
1<=N<=100000,0<=ai<=INT_MAX.
輸出描述:
對於每組資料,輸出兩個數,第一個數表示差最小的對數,第二個數表示差最大的對數。
輸入例子1:
6
45 12 45 32 5 6
輸出例子1:
1 2
這題需要處理的細節很多,比如,最大數裡面,如何計算組合
最小的對數裡面,如何計算
幾個特例對了,很可能就對了
4
2 2 2 2 ->6 6
5
1 1 2 3 3->2 4
#include<iostream> #include <stdio.h> #include<string> #include <vector> #include<algorithm> using namespace std; #define INT_MAX 2147483647 int main() { long N; while(cin>>N) { vector<long> a(N,0); for(long i = 0; i < N;i++) cin>>a[i]; sort(a.begin(),a.end()); long max_cha; long cha_head = 1; long cha_tail = 1; for(long i =0;i < N;i ++) { if(i!= 0) { if(a[i] == a[i-1]) cha_head++; else break; } } for(long i = 0;i < N;i++) { if(i!=0) { if(a[N-i-1] == a[N-i]) cha_tail ++; else break; } } if(cha_tail == N)//全部資料一致 max_cha = N*(N-1)/2; else max_cha = cha_head*cha_tail; //最小 long min_cha = 0; long min = INT_MAX; long lianxu = 1; for(long i =0;i < N;i ++) { if(i!= 0) { if((a[i] - a[i-1]) == 0) lianxu ++; else if(lianxu > 1) { if(min == 0) min_cha+= lianxu * (lianxu - 1)/2; else { min_cha = lianxu * (lianxu - 1)/2; min = 0; } lianxu = 1; } else if((a[i] - a[i-1]) == min) min_cha ++; else if((a[i] - a[i-1]) < min) { min_cha = 1; min = (a[i] - a[i-1]); } } } if(lianxu > 1) { if(min == 0) min_cha+= lianxu * (lianxu - 1)/2; else { min_cha = lianxu * (lianxu - 1)/2; min = 0; } } cout<<min_cha<<" "<<max_cha<<endl; } return 0; }