【爬山】【hdu薛貓貓001】(思維水題)
阿新 • • 發佈:2018-11-19
題目:
Problem Description
小Z準備去爬山,在他的面前有N座山,每座山都有對應的高度。他想選擇兩座高度差最小的山進行攀爬。但由於好多山之間的高度差可能是相同的,所以他需要你告訴他高度差最小的兩座山的高度差是多少以及有多少種不同的選取方式(選取山A、B和選取山B、A視為同一種選取方式)。
Input
輸入一個T,代表資料的組數。(T<=10)
每組資料包含一個N,代表有多少座山。(2<=N<=100,000)
接下來一行包括N個數,分別表示每座山的高度x(1<=x<=1000,000,000)。
Output
對於每組測試樣例,輸出一行,包含兩個整數,代表兩座山最小的高度,以及有多少種不同的方式選取兩座山。兩個數之間用一個空格隔開,每個測試樣例佔一行。
Sample Input
2 5 1 2 5 4 3 4 3 3 3 10
Sample Output
1 4 0 3
Hint
測試樣例包含2組樣例 第一組樣例有5座山,高度分別為1,2,5,4,3,所以高度差最小是1,有4種不同的選取方式, 分別為選取第一座山和第二座山、選取第二座山和第五座山、選取第四座山和第五座山、選取第三座山和第四座山。 第二組樣例有4座山,高度分別為3,3,3,10,所以高度差最小是0,有3種不同的選取方式, 分別為選取第一座山和第二座山、選取第二座山和第三座山、選取第一座山和第三座山。
解題報告:這道題目先排序,然後遍歷尋找最小的高度差,最大的坑點就是你需要處理一下當存在多段 相同數字的情況,因為同為高度差為0 可能會有多種情況,需要每種都去落實。
ac程式碼:
#include<cstdio> #include<iostream> #include<cstring> #include<algorithm> using namespace std; typedef long long ll; const int maxn=1e5+1000; ll num[maxn]; int t,n; ll min(ll a,ll b) { if(a<b) return a; return b; } int main() { scanf("%d",&t); while(t--) { scanf("%d",&n); for(int i=1;i<=n;i++) { scanf("%lld",&num[i]); } sort(num+1,num+n+1); ll minx=99999999; num[0]=0; for(int i=1;i<=n;i++) { minx=min(minx,num[i]-num[i-1]); } ll cnt=0,sum=0; if(minx!=0) { for(int i=2;i<=n;i++) { if(num[i]==num[i-1]+minx) cnt++; } printf("%lld %lld\n",minx,cnt); } else { cnt=1; num[n+1]=0; for(int i=1;i<=n;i++) { if(num[i]==num[i+1]) cnt++; else { sum+=(cnt*(cnt-1)/2); cnt=1; } } // printf("%lld\n",cnt); printf("%lld %lld\n",minx,sum); } } return 0; }