**数组取数**
查看 提交 统计 提问
总时间限制: 1000ms 内存限制: 65536kB
描述
有一个整数数组A和一个目标整数T,希望从A中没有放回地取出两个数,使得两个数之差等于T。请问有多少种不同的取法?(取出的两个数分别相等时视为同一种取法)
输入
输入由两行组成。第一行为两个整型范围内的整数N和T,N为数组长度(N的范围是[2,100000]),T为目标整数。第二行为N个整数,表示数组A,每个整数的范围是[-1000000,1000000]。
输出
A中取出两个数之差为T的不同的取法的数目。
样例输入
6 1
1 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;
}