数据结构与算法mooc 内排序----数组取数

来源:互联网 发布:python取小数点后两位 编辑:程序博客网 时间:2024/04/29 04:29
**数组取数**查看 提交 统计 提问总时间限制: 1000ms 内存限制: 65536kB描述有一个整数数组A和一个目标整数T,希望从A中没有放回地取出两个数,使得两个数之差等于T。请问有多少种不同的取法?(取出的两个数分别相等时视为同一种取法)输入输入由两行组成。第一行为两个整型范围内的整数N和T,N为数组长度(N的范围是[2,100000]),T为目标整数。第二行为N个整数,表示数组A,每个整数的范围是[-1000000,1000000]。输出A中取出两个数之差为T的不同的取法的数目。
样例输入6 11 3 2 1 2 2样例输出2

题目很简单,由于数据量过大,使用数组记录该数字是否被取过,以及目前取过的不重复的数字有哪些,然后直接在无重复数字的数组里找多少种取法.

内存: 10272kB时间: 74ms语言: G++
#include <iostream>#include <cstdio>#include <algorithm>using namespace std;int a;int is_happen[2000010];int _index[100010];int main(){    int n, t, ans = 0, num = 0;    scanf("%d%d",&n,&t);    for(int i=0;i<n;i++)    {        scanf("%d",&a);        a += 1000000;        if(is_happen[a] == 0)        {            _index[num++] = a;        }        is_happen[a]++;    }    //sort(_index,_index+num);        //有num种数字    if(t == 0)    {        for(int i=0;i<num;i++)        {            if(is_happen[_index[i]] >1)                ans++;        }    }    else if(t>0)    {        for(int i=0;i<num;i++)            if(_index[i]+t<=2000009 && is_happen[_index[i]+t]!=0)                ans++;    }    else    {        for(int i=0;i<num;i++)            if(_index[i]+t>=0 && is_happen[_index[i]+t]!=0)                ans++;    }    //printf("%d\n",num);    printf("%d\n",ans);    return 0;}
0 0