[编程题] 有趣的数字
时间限制:1秒空间限制:32768K
小Q今天在上厕所时想到了这个问题:有n个数,两两组成二元组,差最小的有多少对呢?差最大呢?
输入描述:
输入包含多组测试数据。
对于每组测试数据:
N - 本组测试数据有n个数
a1,a2…an - 需要计算的数据
保证:
1<=N<=100000,0<=ai<=INT_MAX.
输出描述:
对于每组数据,输出两个数,第一个数表示差最小的对数,第二个数表示差最大的对数。
输入例子1:
6
45 12 45 32 5 6
输出例子1:
1 2
思路写在注释里了。。。
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main()
{
int n;
vector<int> n_v;
while(cin>>n){
n_v.clear();
int t;
//输入数据
for (int i = 0; i < n; ++i) {
cin>>t;
n_v.push_back(t);
}
//排序
sort(n_v.begin(), n_v.end());
//最大值
int max1_count = 1, max2_count = 1, max_num=0;
int i;
for (i = 1; i < n; ++i) {
if(n_v[i]==n_v[0]) max1_count++;
else break;
}
for (int i = n-2; i >= 0; --i) {
if(n_v[i]==n_v[n-1]) max2_count++;
else break;
}
if(i==n){
//说明都是一个数字
max_num = n_v.size()*(n_v.size()-1)/2;
}
else{
max_num = max1_count*max2_count;
}
//最小值
int mins_num=0, mins=n_v[n-1];
//先求出最小的差值
for (int i = 1; i < n; ++i) {
if(n_v[i]-n_v[i-1] < mins) mins = n_v[i]-n_v[i-1];
}
if(mins>0){
//数字都是不一样的
for (int i = 1; i < n; ++i) {
if(n_v[i]-n_v[i-1]==mins) mins_num++;
}
}
else{
//有一样的数字,那么,每个数字都向前找一遍,遇到和自己相同的,就mins_num++,因为差都是零。
//因为是排序好的,所以可以如果遇到和自己不同的,就直接检查自己的下一个了
for (int j = 1; j < n; ++j) {
int tt=j-1;
while(n_v[j]==n_v[tt])
{
mins_num++;
tt--;
if(tt<0) break;
}
}
}
cout<<mins_num<<" "<<max_num<<endl;
}
return 0;
}