问题标题: 酷町堂:1772 A-B=C

0
0
已解决
汪宇航
汪宇航
新手启示者
新手启示者

题目描述 Description

给定 n 个数 ai,以及一个正整数 c ,问有多少对 i j,满足 ai - aj = c

输入描述 Input Description

第 1 行:整数 n 和 c
第 2 至 n+1 行:每行包含一个整数 ai

输出描述 Output Description

输出能满足 ai - aj = c 的数的对数

样例输入 Sample Input

5 3 2 1 4 2 5

样例输出 Sample Output

3

 

 

1772:A - B = C

Time Limit Exceeded:80分

汪宇航的测评结果:

测试点

结果

时间

 

1

Accepted

0ms

偷看一下数据

2

Accepted

0ms

偷看一下数据

3

Accepted

4ms

偷看一下数据

4

Accepted

0ms

偷看一下数据

5

Accepted

0ms

偷看一下数据

6

Accepted

0ms

偷看一下数据

7

Accepted

0ms

偷看一下数据

8

Accepted

0ms

偷看一下数据

9

Time Limit Exceeded

2004ms

偷看一下数据

10

Time Limit Exceeded

1992ms

偷看一下数据

汪宇航的提交(cpp):

 
  • #include <iostream>
  • #pragma GCC optimize(3)
  • using namespace std;
  • int n,c,cnt=0,a[1000000];
  • int main(){
  • cin>>n>>c;
  • for(int i=1;i<=n;i++){
  • cin>>a[i];
  • }
  • for(int i=1;i<=n;i++){
  • for(int j=1;j<=n;j++){
  • if(a[i]-a[j]==c&&i!=j){
  • cnt++;
  • }
  • }
  • }
  • cout<<cnt;
  • return 0;
  • }

0
已采纳
汪恺恒
汪恺恒
中级启示者
中级启示者

我是用map写的

定义map<int,int>b;

之后和桶差不多

输入a[i]时,b[a[i]]++;

然后遍历数组,ans+=b[a[i]+c]

最后输出ans

0
0
张帆
张帆
中级天翼
中级天翼

先把数组a排个序

这样就可以

把第二重循环j的起始点改为i,

for(int j=i;j<=n;j++){
}

然后每次判断改为:

if(a[j]-a[i]==c){
                cnt++;
            } 
            if(a[j]-a[i]>c) break;

就可以AC了。

0
沙宸安
沙宸安
高级启示者
高级启示者

诸位大佬,我就想问一下,这题能用桶吗?

我要回答