18728 数对问题二
时间限制:1000MS 代码长度限制:10KB
提交次数:0 通过次数:0
题型: 编程题 语言: G++;GCC
Description
此题目与数对问题一的唯一区别为序列中元素的取值范围。
一个长度为N的正整数序列,现在需要计算出有多少对数字的差的绝对值为C。
注意只要位置不同就认为是不相同的数对。
输入格式
第一行,两个整数 N, C。(1=<N<=10000),(1=<C<=10000)
第二行,N个正整数a1…an。 ai为int范围内的正整数。
输出格式
仅一行,满足条件的数对的个数。
输入样例
4 1
1 2 3 1
输出样例
3
提示
(a1,a2),(a2,a3),(a2,a4)共3个数对满足条件。
注意,我的哈希表是一个数两个位置,第一位为数,第二位为数的个数
#define _CRT_SECURE_NO_WARNINGS
#include "stdio.h"
#include "stdlib.h"
#include "iostream"
#include "string"
using namespace std;
#include <vector>
int main(void){
//定义一个数组
int num[10005];
vector <int> hash[10005];
//次数k
int k = 0;
int N,C;
int remainder;
cin >> N >> C;
for (int i = 1; i <= N; i++) {
cin >> num[i];
}
//录入第一个
remainder = num[1] % 9997;
hash[remainder].push_back(num[1]);
hash[remainder].push_back(1);
for (int i = 2; i <= N; i++) {
int j;
int a = num[i] - C;
int b = num[i] + C;
//一定要判断a>0才能够查
if (a > 0) {
//查这个数有没有 如果有就+次数
remainder = a % 9997;
for (j = 0; j < hash[remainder].size(); j += 2) {
if (a == hash[remainder][j]) {
k += hash[remainder][j + 1];
break;
}
}
}
//同理,这里因为b是num[i]+C必为正数 不用判断直接可以查
remainder = b % 9997;
for (j = 0; j < hash[remainder].size(); j += 2) {
if (b == hash[remainder][j]) {
k += hash[remainder][j + 1];
break;
}
}
//num[i]在哈希表次数+1
remainder = num[i] % 9997;
//找到j的位置
for (j = 0; j < hash[remainder].size(); j += 2) {
if (num[i] == hash[remainder][j]) {
hash[remainder][j + 1]++;
break;
}
}
//注意 j的位置 是 最后一个数位置+2 如果哈希表为空j为0
//如果没出现过并且 哈希表不为空
if (j > 0) {
if (j == hash[remainder].size() && num[i] != hash[remainder][j - 2]) {
hash[remainder].push_back(num[i]);
hash[remainder].push_back(1);
}
}
//如果没出现过并且 哈希表为空
else if (j == 0) {
hash[remainder].push_back(num[i]);
hash[remainder].push_back(1);
}
}
cout << k;
return 0;
}