題目:
小Q今天在上廁所時想到了這個問題:有n個數(shù)珍坊,兩兩組成二元組,差最小的有多少對呢正罢?差最大呢阵漏?
輸入描述:
輸入包含多組測試數(shù)據(jù)。
對于每組測試數(shù)據(jù):
N - 本組測試數(shù)據(jù)有n個數(shù)
a1,a2…an - 需要計算的數(shù)據(jù)
保證:
1<=N<=100000,0<=ai<=INT_MAX.
輸出描述:
對于每組數(shù)據(jù)翻具,輸出兩個數(shù)履怯,第一個數(shù)表示差最小的對數(shù),第二個數(shù)表示差最大的對數(shù)裆泳。
輸入例子:
6 45 12 45 32 5 6
輸出例子:
1 2
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
void result(vector<int> &a,int n);
int main()
{
int num;
while(cin>>num)
{
int temp;
vector<int> data;
for(int i=0; i<num; ++i)
{
cin>>temp;
data.push_back(temp);
}
result(data,num);
}
return 0;
}
void result(vector<int> &a,int n)
{
if(n<1) return;
sort(a.begin(),a.end());
int m1 = 1;
int m2 = 1;
for(int i=0; i<n-1; ++i)//最小值統(tǒng)計重復
{
if(a[i+1]!=a[i])
{
break;
}
++m1;
}
for(int i=n-1; i>0; --i)//最大值統(tǒng)計重復
{
if(a[i-1]!=a[i])
{
break;
}
++m2;
}
int maxNum=m1*m2;//最大的個數(shù)乘以最小的個數(shù)
int min_temp=a[1]-a[0];
int minNum=0;
for(int i=2; i<n; ++i)
{
if(a[i]-a[i-1]<min_temp)
{
min_temp=a[i]-a[i-1];
}
}
if(min_temp==0)//最小是0說明最小值相同
{
for(int i=0; i<n; ++i)
{
int j=i-1;
while(j>=0&&a[j]==a[i])//統(tǒng)計兩者之差的個數(shù)
{
++minNum;
--j;
}
}
}
else
{
for(int i=1; i<n; ++i)
{
if(a[i]-a[i-1]==min_temp)
{
++minNum;
}
}
}
if(m1==m2) {
maxNum=minNum;//如果全部一樣 最大的值不能 m1相乘m2
}
cout<<minNum<<' '<<maxNum<<endl;
}