[编程题] 有趣的数字

来源:互联网 发布:应聘淘宝客服 编辑:程序博客网 时间:2024/05/13 02:02

编程题] 有趣的数字

时间限制:1秒

空间限制:32768K

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



输入描述:

输入包含多组测试数据。 对于每组测试数据: N - 本组测试数据有n个数 a1,a2...an - 需要计算的数据 保证: 1<=N<=100000,0<=ai<=INT_MAX.



输出描述:

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


输入例子1:
645 12 45 32 5 6

输出例子1:
1 2

思路: 对于最大的,是判断最小的个数,和最大的个数乘法

     判断最大的个数,从左到右扫过去


#include <iostream>#include <stdlib.h>#include <string.h>#include <stdio.h>#include <queue>#include <algorithm>#include <cstring>using namespace std;typedef long long ll;ll a[100005];int main(){    int n;    while(cin>>n){        for(int i=1;i<=n;i++) cin>>a[i];        if(n==1) {cout<<0<<" "<<0<<endl;continue;}        sort(a+1,a+1+n);        ll maxx=-1,  minn=0x3f3f3f3f3f;        ll maxx_n=1,minn_n=1;        for(int i=2;i<=n;i++)            if(a[i]==a[i-1])                minn_n++;            else break;        if(minn_n==n) cout<<n<<" "<<n<<endl;        else{            for(int i=n-1;i>=1;i--)                if(a[i]==a[i+1])                    maxx_n++;                else break;            ll ans2=maxx_n*minn_n;            ll left=1,ans1=0;            for(int i=2;i<=n;i++)            {                if(a[i]-a[i-1]<minn)                    minn=a[i]-a[i-1],ans1=1;                else if(a[i]-a[i-1]==minn) ans1+=left;                if(a[i]==a[i-1]) left++;                else left=1;            }            cout<<ans1<<" "<<ans2<<endl;        }    }}/*61 1 1 2 2 2*/


原创粉丝点击