栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

【C++】有趣的数字

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

【C++】有趣的数字

题目描述:

有趣的数字__牛客网有趣的数字 ,腾讯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 

 

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/784144.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号