SPOJ INUMInteresting Numbers 简单细节题

来源:互联网 发布:京东 淘宝 显卡 编辑:程序博客网 时间:2024/06/03 17:16

1 题意

给N个数,问有多少个无序数对(i,j)(其中,i<j),使得|a[i]-a[j]|达到最大值或者最小值。

点击打开链接

2 分析

虽然说是简单题,但是当时一直WA。

注意细节、特判,过程中可能会溢出所以都用long long,以及最重要的是、书写要条理一点。

5

1 1 1 1 1

5

1 1 1 2 2

3

#include <iostream>#include <math.h>#include <stdio.h>#include <string.h>#include <algorithm>using namespace std;typedef long long ll;int n;const int maxn=1e5+10;ll a[maxn],b[maxn];ll min_num,max_num;ll res_min;ll res_max;int main(){    while(~scanf("%d",&n)){        for(int i=0;i<n;i++){            scanf("%lld",&a[i]);        }        sort(a,a+n);        min_num=max_num=1;        res_min=res_max=0;        for(int i=1;i<n;i++){            if(a[i]==a[i-1]){                min_num++;            }            else{                break;            }        }        for(int j=n-2;j>=0;j--){            if(a[j]==a[j+1]){                max_num++;            }            else{                break;            }        }        res_max=(max_num*min_num);        int flag=1;        for(int i=1;i<n;i++){            if(a[i]==a[i-1]){                flag=0;                break;            }        }        if(flag){            for(int i=0;i<n-1;i++){                b[i]=a[i+1]-a[i];            }            sort(b,b+n-1);            res_min=1;            for(int i=1;i<n;i++){                if(b[i]==b[i-1]){                    res_min++;                }                else{                    break;                }            }        }        else{            long long temp2=1;            res_min=0;            for(int i=1;i<n;i++){                if(a[i]==a[i-1]){                    temp2++;                }                else{                    if(temp2>1){                        res_min+=(temp2)*(temp2-1)/2;                        temp2=1;                    }                }            }            if(temp2>1){                res_min+=(temp2)*(temp2-1)/2;                temp2=1;            }        }        flag=1;        for(int i=1;i<n;i++){            if(a[i]!=a[i-1]){                flag=0;                break;            }        }        if(flag){            res_max=(long long)((long long)n*(long long)(n-1))/2;            res_min=res_max;        }        cout<<res_min<<" "<<res_max<<endl;    }}

0 0
原创粉丝点击