1. 程式人生 > >洛谷——P2421 A-B數對(增強版)

洛谷——P2421 A-B數對(增強版)

++ 可能 復制 fin radi 輸入輸出格式 個數 -c ()

題目背景

woshiren在洛谷刷題,感覺第一題:求兩數的和(A+B Problem)太無聊了,於是增加了一題:A-B Problem,難倒了一群小朋友,哈哈。

題目描述

給出N 個從小到大排好序的整數,一個差值C,要求在這N個整數中找兩個數A 和B,使得A-B=C,問這樣的方案有多少種?

例如:N=5,C=2,5 個整數是:2 2 4 8 10。答案是3。具體方案:第3 個數減第1 個數;第3 個數減第2 個數;第5 個數減第4 個數。

輸入輸出格式

輸入格式:

第一行2 個正整數:N,C。

第二行N 個整數:已經有序。註意:可能有相同的。

輸出格式:

一個整數,表示該串數中包含的所有滿足A-B=C 的數對的方案數。

輸入輸出樣例

輸入樣例#1: 復制
4 1
1 1 2 2
輸出樣例#1: 復制
4

說明

對於50% 的數據:N 的範圍是[1…1,000]。

對於另外50% 的數據:N 的範圍是[1…100,000]。

對於100% 的數據:C 的範圍是[1…1,000,000,000],N 個整數中每個數的範圍是:[0…1,000,000,000]。

模擬

#include<map>
#include<cstdio>
#include<cstring>
#include<iostream>
#include
<algorithm> #define N 200100 #define ll long long using namespace std; map<int,int>m; ll n,c,ans,a[N],maxn; ll read() { ll x=0,f=1; char ch=getchar(); while(ch<0||ch>9){if(ch==-)f=-1;ch=getchar();} while(ch>=0&&ch<=9) x=x*10+ch-0,ch=getchar();
return x*f; } int main() { n=read(),c=read(); for(int i=1;i<=n;i++) a[i]=read(),m[a[i]]++; sort(a+1,a+1+n); for(int i=1;i<=n;i++) ans+=m[a[i]+c]; printf("%lld",ans); return 0; }

洛谷——P2421 A-B數對(增強版)