题目描述:
有趣的数字__牛客网有趣的数字 ,腾讯2017暑期实习生编程题 https://www.nowcoder.com/questionTerminal/af709ab9ca57430886632022e543d4c6
小Q今天在上厕所时想到了这个问题:有n个数,两两组成二元组,相差最小的有多少对呢?相差最大呢?
输入描述:
输入包含多组测试数据。
输出描述:
对于每组测试数据:
N - 本组测试数据有n个数
a1,a2...an - 需要计算的数据
保证:
1<=N<=100000,0<=ai<=INT_MAX.对于每组数据,输出两个数,第一个数表示差最小的对数,第二个数表示差最大的对数。
示例1
输入6 45 12 45 32 5 6输出1 2
这一题乍以看很懵圈。
我是暴力解的,有点乱哈,先梳理一下思路。
特殊情况:
数组内是否有相同的数字:
如果有:那么最小值一定是0,我们要找出差值0的个数,即为最小值,也就是说要找出数组内有多少个相同的数字,假设最小值是1,在数组内仅有3个,那么差值为0的个数为:
num = (3-1)*3/2 = 3 对;
所以我们要找出数组内所有数字相同的组,并找出来这一组有多少个,利用公式 (n-1)*n/2,依次累加。即为最小值的对数。
最大值就是最小值的个数*最大值的个数,通过一次遍历即可求得。
如果没有相同的
那么最大值的对数只有一对,就是最大值减去最小值。但最小值的对数,我们要通过做遍历的手段来获得,获得之后还要再遍历一次,才能获得对数。
如果数组内的数据都相同
比如 1 1 1 1 1,那么最大值和最小值的对数都是一样的,即为最小值的对数。
代码如下:
//有趣的数字 #include#include #include using namespace std; int st[1000000]; int main(){ int n; while(cin>>n){ int maxnum = 0; int minnum = 2147483647;//可以用INT_MAX for(int i=0;i >st[i]; if(st[i]>maxnum){ maxnum = st[i]; //在输入数据的时候就找出来最大值和最小值 } if(st[i] =2){ //大于等于2时才可以去做累加 sumSame+=pos*(pos-1)/2; } pos = 1; //累加完后初始化 } } if(pos!=1){ //如果当前pos还有数字,加上去 sumSame+=pos*(pos-1)/2; } if(sumSame==0){ //数组内没有一个相同的 int temp = 2147483647; for(int k=1;k



