题目:
小Q今天在上厕所时想到了这个问题:有n个数,两两组成二元组,差最小的有多少对呢?差最大呢?
输入描述:
输入包含多组测试数据。
有趣的数字
小Q今天在上厕所时想到了这个问题:有n个数,两两组成二元组,差最小的有多少对呢?差最大呢?
输入描述:
输入包含多组测试数据。
对于每组测试数据:
N - 本组测试数据有n个数
a1,a2…an - 需要计算的数据
保证:
1<=N<=100000,0<=ai<=INT_MAX.
输出描述:
对于每组数据,输出两个数,第一个数表示差最小的对数,第二个数表示差最大的对数。
输入例子:
6
45 12 45 32 5 6
输出例子:
1 2
代码:
#include <iostream> #include <string> #include <algorithm> #include <vector> using namespace std; void Test(std::vector<int> & a) { int minNum = 0, maxNum = 0; int n = a.size(); //排序 std::sort(a.begin(),a.end()); //求最大,即最大数量乘以最小数量 int m1 = 0, m2 = n-1, mi = 1, ma = 1; //找最小值的个数 while (a[m1+1]==a[m1]) { mi++; m1++; } //找最大值的个数 while (a[m2-1]==a[m2]) { ma++; m2--; } maxNum = mi * ma; /* 求最小 必定是相邻的差值较小,故由排序后的有序数组求出差值最小值。 如果差值最小值为0,则算出数组中相等的元素的对数; 如果差值最小值不为0,则只需计算有多少个最小值即可 */ //找到差最小值 int minTemp = a[n - 1]; for (int i=0;i<n-2;i++) { if (minNum>a[i+1]-a[i]) { minTemp = a[i + 1] - a[i]; } } if (minTemp>0) { minNum = mi; } else { for (int i=0;i<n-2;i++) { for (int j=i+1;j<n-1;j++) { if (a[i]==a[j]) { minNum++; } } } } std::cout << minNum << " " << maxNum << std::endl; } int main() { int n; while (std::cin >> n) { std::vector<int>a(n); for (int i=0;i<n;i++) { std::cin >> a[i]; } Test(a); } return 0; }