题目描述
出题是一件痛苦的事情!
题目看多了也有审美疲劳,于是我舍弃了大家所熟悉的A+B Problem,改用A-B了哈哈!
好吧,题目是这样的:给出一串数以及一个数字C,要求计算出所有A-B=C的数对的个数。(不同位置的数字一样的数对算不同的数对)
输入输出格式
输入格式:第一行包括2个非负整数N和C,中间用空格隔开。
第二行有N个整数,中间用空格隔开,作为要求处理的那串数。
输出格式:输出一行,表示该串数中包含的所有满足A-B=C的数对的个数。
输入输出样例
输入样例#1:
4 1 1 1 2 3
输出样例#1:
3
说明
对于73%的数据,N <= 2000;
对于100%的数据,N <= 200000。
所有输入数据都在longint范围内。
2017/4/29新添数据两组
#include<iostream> //第一次的wa o^2超时
#include<algorithm>
#include<string.h>
using namespace std;
typedef long long ll;
int main()
{
int n,k;
cin>>n>>k;
ll a[200005];
for(ll i=0;i<n;i++)
cin>>a[i];
sort(a,a+n);
ll e=0;
for(ll i=n-1;i>=1;i--)
for(ll j=i-1;j>=0;j--)
{
if(a[i]-a[j]==k)
{
e++;
}
if(a[i]-a[j]>k)
break;
}
cout<<e<<endl;
return 0;
}
/* ac代码
#include<iostream>
#include<algorithm>
using namespace std;
int big,n,c,s;
int a[1000000],b[1000000]; //数组要大。
int main()
{
cin>>n>>c;
for(int i=1;i<=n;i++)
{
cin>>a[i];
b[a[i]]++; //数组计数,判断数出现了几个次数。
if(a[i]>big) big=a[i];
}
for(int i=1;i<=big;i++)
{
if((b[i]>0)&&(b[i+c]>0)) s=s+b[i]*b[i+c]; //判断是否可以组成a-b数对,如果可以的话就是两个数的次数的乘积。
}
cout<<s; //输出。
return 0;
}
*/