牛客网答题笔记---有趣的数字

原创 2016年08月30日 23:28:44

题目描述

小Q今天在上厕所时想到了这个问题:有n个数,两两组成二元组,差最小的有多少对呢?差最大呢?

输入描述:

输入包含多组测试数据。

对于每组测试数据:
N - 本组测试数据有n个数
a1,a2...an - 需要计算的数据

保证:
 1<=N<=100000,0<=ai<=INT_MAX.

输出描述:

对于每组数据,输出两个数,第一个数表示差最小的对数,第二个数表示差最大的对数。

输入例子:

6
45 12 45 32 5 6

输出例子:

1 2

题目分析

这个题目是要我们找最大的差和最小的差的个数,那么我们分开想:
1.最大的差,这个怎么找呢?最大的差就是最大的数和最小数的差,那么取决于这最小的数和最大的数的个数,假设一个最小数,3个最的数,就有三个相同的最大差,那么这个就很好想了。Max = 最大数个数 * 最小数个数
2.最小的差。这个麻烦一点,因为任何两个数都可能产生最小差,那么我这里必须遍历所有可能的差值,找到最小差值,然后再统计最小差的个数Min。
3.首先,先对数组进行一个排序,无论是对于找Max或者Min(这样的数组相邻的相减肯定是得到:有可能是最小差的所有差值,省去了计算很多无用的差值)都是大有帮助。

代码

#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;

int main(){
    int n;
    while(cin>>n){
        vector<int> res(n);
        for(int i = 0;i < n;i++)
            cin>>res[i];
        sort(res.begin(),res.end());
        int Max = 0;
        int Min = 0;
        int minless = res[1] - res[0];
        Max = count(res.begin(),res.end(),res[n-1]) * count(res.begin(),res.end(),res[0]);
        for(int i = 2;i < n;i++){
            if((res[i] - res[i-1]) < minless)
                minless = res[i] - res[i-1];
        }
        for(int i = 1;i < n;i++){
            for(int j = i-1;j >= 0;j--){
                if((res[i] - res[j]) == minless)
                    Min++;
                else
                    break;
            }
        }
        if(res[n-1] == res[0]){
            Max = res.size() * (res.size() - 1)>>1;
            Min = Max;
        }
        cout<<Min<<" "<<Max<<endl;   
    }
    return 0;
}
版权声明:本文为博主原创文章,未经博主允许不得转载。

牛客网-做题笔记

笔试题
  • sinat_32393077
  • sinat_32393077
  • 2017年08月06日 11:11
  • 219

牛客网答题笔记---数字游戏

题目描述小易邀请你玩一个数字游戏,小易给你一系列的整数。你们俩使用这些整数玩游戏。每次小易会任意说一个数字出来,然后你需要从这一系列数字中选取一部分出来让它们的和等于小易所说的数字。 例如: 如果...
  • tingyun_say
  • tingyun_say
  • 2016年09月03日 21:32
  • 599

C++ 牛客网做题笔记【1100题总结】

1:作为成员函数重载的运算符若没有任何参数,则该运算符为前缀一元运算符,就像++和--一样有前缀后缀,为了进行区分,要求在后缀形式之后加一个int参数,比如A operator++(int) 就是后缀...
  • misayaaaaa
  • misayaaaaa
  • 2017年04月22日 08:59
  • 684

牛客网答题笔记--构造队列

这篇文章接上一篇,在牛客上关于一道约瑟夫环问题的解题笔记:题目描述:小明同学把1到n这n个数字按照一定的顺序放入了一个队列Q中。现在他对队列Q执行了如下程序:while(!Q.empty()) ...
  • tingyun_say
  • tingyun_say
  • 2016年08月28日 15:08
  • 618

牛客网中级项目学习笔记(一)

牛客中级项目学习: MyBatis 可以通过注解和xml的方式操作数据库,只关心读取写入,不用关心数据库如何连接的。 xml方式操作数据库比注解的好处是可以进行逻辑复杂的操作 private...
  • qq_31617121
  • qq_31617121
  • 2018年01月27日 10:20
  • 263

牛客网答题笔记---字符串变型

题目描述:对于一个给定的字符串,我们需要在线性(也就是O(n))的时间里对它做一些变形。 首先这个字符串中包含着一些空格,就像”Hello World”一样,然后我们要做的是把着个字符串中由空格隔开...
  • tingyun_say
  • tingyun_say
  • 2016年09月04日 12:57
  • 321

牛客网练习知识点笔记——综合

数据结构 首先要明确前序,中序和后序的遍历顺序:  前序:父节点,左子节点,右子节点;  后序:左子节点,右子结点,父节点; 一个5*4的矩阵,有多少个长方形?长任取两个点C(6,2)*宽任取两个...
  • huxiaoyonglan1
  • huxiaoyonglan1
  • 2015年12月11日 20:22
  • 1269

牛客网答题笔记---字符移位

题目描述:小Q最近遇到了一个难题:把一个字符串的大写字母放到字符串的后面,各个字符的相对位置不变,且不能申请额外的空间。 你能帮帮小Q吗?分析这题的给出的一个提醒点是不要申请额外的空间,那么我们在m...
  • tingyun_say
  • tingyun_say
  • 2016年08月30日 23:14
  • 412

牛客网刷题笔记

本来想在牛客网上刷完一道在线编程题后就写以下体会笔记,可是找了半天都没找到在哪里写东西,无奈,我就只好来CSDN上写了,只是想写而已,刚开始写,肯定会很不理想,但是没关系,慢慢写吧,总会有提高的。 ...
  • liu_sheng_1991
  • liu_sheng_1991
  • 2016年06月15日 10:40
  • 1106

牛客网答题笔记-java网络编程

1.动态链接库的优点:共享,开发模式好,减少页面交换。2.n个数值选出最大的n个数的最小算法复杂度是O(nlogn),将n个·数排序,排序后的前k个数就是最大数值,3.在读取磁盘多个数据块时,通道方式...
  • luoaijun12
  • luoaijun12
  • 2016年11月28日 18:36
  • 194
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:牛客网答题笔记---有趣的数字
举报原因:
原因补充:

(最多只允许输入30个字)