题目:
小Q今天在上厕所时想到了这个问题:有n个数,两两组成二元组,差最小的有多少对呢?差最大呢?
输入描述:
输入包含多组测试数据。
对于每组测试数据:
N - 本组测试数据有n个数
a1,a2…an - 需要计算的数据
保证:
1<=N<=100000,0<=ai<=INT_MAX.
输出描述:
对于每组数据,输出两个数,第一个数表示差最小的对数,第二个数表示差最大的对数。
最大肯定是最大值的个数*最小值的个数
#include<bits/stdc++.h>
using namespace std;
int a[100005];
int b[100005];
typedef long long LL;
map<int ,int > m;
int main()
{
int n;
while(~scanf("%d",&n))
{
m.clear();
int j=0;
int f=0;
for(int i=0; i<n; i++)
{
scanf("%d",&a[i]);
m[a[i]]++;
if(m[a[i]]==1)
{
b[j++]=a[i];
}
else
{
f=1;
}
}
LL x = 0;
n=j;
sort(b,b+n);
if(f==0)
{
LL Min=1e12;
for(int i=1; i<n; i++)
{
LL num = (LL) b[i]-b[i-1];
if(num<Min)
{
Min=num;
}
}
x=0;
for(int i=1; i<n; i++)
{
LL num = (LL) b[i]-b[i-1];
if(num==Min)
{
x++;
}
}
}
else
{
x = 0;
for(int i=0; i<n; i++)
{
if(m[b[i]]>1)
{
x = x + (LL)m[b[i]]*(m[b[i]]-1)/2;
}
}
}
LL y;
if(n==1)
{
y=(LL)m[b[0]]*(m[b[0]]-1);
}
else
{
y=(LL)m[b[n-1]]*m[b[0]];
}
printf("%lld %d\n",x,y);
}
return 0;
}