2017腾讯校招暑期实习生笔试题3

题目:

小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;
    }



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值