18727 数对问题一
时间限制:1000MS 代码长度限制:10KB
提交次数:0 通过次数:0
题型: 编程题 语言: 不限定
Description
一个长度为N的正整数序列,现在需要计算出有多少对数字的差的绝对值为C。
注意只要位置不同就认为是不相同的数对。
输入格式
第一行,两个整数 N, C。(1=<N<=10000),(1=<C<=10000)
第二行,N个正整数a1…an。 (1=<ai<=10000)
输出格式
仅一行,满足条件的数对的个数。
输入样例
4 1
1 2 3 1
输出样例
3
提示
(a1,a2),(a2,a3),(a2,a4)共3个数对满足条件。
分析:
本题可以用暴力的方法,直接双层循环做也不会超时,但有更快的方法,我们可以观察到,本题数据范围都较小,都在一万以内,所以可以用一个标记数组,每输入一个数据,则使该标记数组距离其±c的元素自增,最后把下标为数据的标记数组元素加起来再除以二即可。为什么要除二?因为在这个机制下,会使数据重复出现。
如:输入格式是
第一行 2 1
第二行 5 6
当输入5的时候,4和6都会被标记自增,设标记数组为a[n] 则a[4]++,a[6]++,但当输入6的时候a[5]++;因此符合条件的数对会记录两次。
代码
#include <iostream>
#include <cstring>
using namespace std;
int num[100010],a[200010];
int main(void)
{
memset(num,0,sizeof(num));
memset(a,0,sizeof(a));
int n,c,sum=0;
cin>>n>>c;
int i;
for(i=1;i<=n;i++)
{
cin>>num[i];
a[num[i]+c]++;
if(num[i]-c>=0)
a[num[i]-c]++;
}
for(i=1;i<=n;i++)
{
sum+=a[num[i]];
}
cout<<sum/2;
return 0;
}
1029

被折叠的 条评论
为什么被折叠?



