P1102 A-B 数对

题目描述

出题是一件痛苦的事情!

题目看多了也有审美疲劳,于是我舍弃了大家所熟悉的 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%73%的数据,N≤2000;

对于100%100%的数据,N≤200000。

所有输入数据都在longint范围内。

2017/4/29新添数据两组

【思路】

两种思路,用桶或者用双指针

【桶】

输入数据,用一个桶存一下

然后从1枚举到最大值

如果一个数出现过

并且他减去c的数也出现过

那么数对的数量就是

这两个数的桶里面存的值乘起来

最后加起来就好了

【完整代码】

#include<cstdio>
#include<iostream>
#include<map> using namespace std; int a[200005];//桶存储每个出现过的数的次数
map<int,int> tong; int main()
{
int n,c;
scanf("%d%d",&n,&c);
for(int i = 1;i <= n;++ i)
{
scanf("%d",&a[i]);
tong[a[i]] ++;//计数
}
long long js = 0;
for(int i = 1;i <= n;++ i)
{//这里倒着想不去找两个数而是找一个然后再找另一个
js += tong[a[i] + c];
}
printf("%lld\n",js);
return 0;
}

【双指针】

双指针

现将输入的那串数字排一下序

然从以一个开始枚举

头指针先不动

尾指针累加知道尾指针所在的位置上面的数

减去头指针所在的数的差大于等于c

然后判断是否等于c

如果等于c计数器累加

不过这道题目会出现重复的数

如果单纯的按照上面的方法是没法处理重复的数

所以可以在

当你找到一组差恒等于c的数的时候

判断一下大的后面还有没有也可以减去小的恒等于c的

也就是等于大的的

为什么不处理小的而是处理大的呢?

因为我的思路是枚举小的所以小的都会扫一遍

但是大的确实会跳过去的

所以应该处理大的

不过如果你处理出来有多少个和他相等的

那就用一个桶记录一下

到时候再一次用到的话直接O(1)查询就好

不然会超时

依次枚举下去

因为头指针和尾指针都是只将那串数字扫一遍

所以复杂度是线性的

【完整代码】

#include<iostream>
#include<cstdio>
#include<algorithm> using namespace std;
const int Max = 200005;
int a[Max];
int t[Max];
int main()
{
int n,c;
cin >> n >> c;
long long js = 0;
for(register int i = 1;i <= n;++ i)
cin >> a[i];
sort(a + 1,a + 1 + n);
for(register int l = 1,r = 1;l <= n;++ l)
{
while(a[r] - a[l] < c && r <= n)
r ++;
if(r > n)
break;
if(a[r] - a[l] == c)
{
int jj;
if(t[r] != 0)
{
jj = t[r];
}
else
{
jj = 1;
int rr = r + 1;
while(a[rr] - a[l] == c)
jj ++,rr ++;
t[r] = jj;
}
js += jj;
}
}
cout << js << endl;
return 0;
}

【PS】

其实还有更简单的方法的

思路说一哈:

枚举大数A,用双指针法找到最靠前与A差≤ C的,和最靠后与A差≥ C的。如果这两个位置不是在同一个数上面,那么他们中间就是还有符合要求的数,所以这中间的数的个数(包括两个位置上面的)都累加起来。

但是貌似实现起来很复杂,只想出来了思路没有去实现瞎搞了一下搞了上面的思路然后A掉了QWQ

洛谷 P1102 A-B数对 题解的更多相关文章

  1. 洛谷 P1102 A−B数对

    题目描述 出题是一件痛苦的事情! 题目看多了也有审美疲劳,于是我舍弃了大家所熟悉的 A+BA+BA+B ProblemProblemProblem ,改用 A−BA-BA−B 了哈哈! 好吧,题目是这 ...

  2. 洛谷P1102 A-B数对

    洛谷P1102 A-B数对 https://www.luogu.org/problem/show?pid=1102 题目描述 出题是一件痛苦的事情! 题目看多了也有审美疲劳,于是我舍弃了大家所熟悉的A ...

  3. 洛谷P1854 花店橱窗布置 分析+题解代码

    洛谷P1854 花店橱窗布置 分析+题解代码 蒟蒻的第一道提高+/省选-,纪念一下. 题目描述: 某花店现有F束花,每一束花的品种都不一样,同时至少有同样数量的花瓶,被按顺序摆成一行,花瓶的位置是固定 ...

  4. HAOI2006 (洛谷P2341)受欢迎的牛 题解

    HAOI2006 (洛谷P2341)受欢迎的牛 题解 题目描述 友情链接原题 每头奶牛都梦想成为牛棚里的明星.被所有奶牛喜欢的奶牛就是一头明星奶牛.所有奶 牛都是自恋狂,每头奶牛总是喜欢自己的.奶牛之 ...

  5. 洛谷P3412 仓鼠找$Sugar\ II$题解(期望+统计论?)

    洛谷P3412 仓鼠找\(Sugar\ II\)题解(期望+统计论?) 标签:题解 阅读体验:https://zybuluo.com/Junlier/note/1327573 原题链接:洛谷P3412 ...

  6. 洛谷P3502 [POI2010]CHO-Hamsters感想及题解(图论+字符串+矩阵加速$dp\&Floyd$)

    洛谷P3502 [POI2010]CHO-Hamsters感想及题解(图论+字符串+矩阵加速\(dp\&Floyd\)) 标签:题解 阅读体验:https://zybuluo.com/Junl ...

  7. 洛谷P4587 [FJOI2016]神秘数(主席树)

    题面 洛谷 题解 考虑暴力,对于询问中的一段区间\([l,r]\),我们先将其中的数升序排序,假设当前可以表示出\([1,k]\)目前处理\(a_i\),假如\(a_i>k+1\),则答案就是\ ...

  8. DP,数论————洛谷P4317 花神的数论题(求1~n二进制中1的个数和)

    玄学代码(是洛谷题解里的一位dalao小粉兔写的) //数位DP(二进制)计算出f[i]为恰好有i个的方案数. //答案为∏(i^f[i]),快速幂解决. #include<bits/stdc+ ...

  9. 洛谷:P3281 [SCOI2013]数数 (优秀的解法)

    刷了这么久的数位 dp ,照样被这题虐,还从早上虐到晚上,对自己无语...(机房里又是只有我一个人,寂寞.) 题目:洛谷P3281 [SCOI2013]数数 题目描述 Fish 是一条生活在海里的鱼, ...

  10. 【洛谷p1012】拼数

    (今天yuezhuren大课间放我们出来了……) (另外今天回了两趟初中部) 拼数[传送门] 洛谷算法标签: (然鹅这两个学的都不好,能过真的how strange) 开始的时候没读题啊,直接暴力so ...

随机推荐

  1. GC偏好

    GC偏好 测序中的GC偏好指的是基因组上GC含量在50%左右的区域更容易被测到,产生的reads更多,这些区域的覆盖度更高, 在高GC或者低GC区域,不容易被测到,产生较少的reads,这些区域的覆盖 ...

  2. Python小爬虫-读取豆瓣电影名称导出csv

    # -*- coding: utf-8 -*- __author__ = 'YongCong Wu' # @Time : 2019/6/20 10:27 # @Email : : 1922878025 ...

  3. 二叉排序树详解——PHP代码实现

    二叉排序树(Binary Sort Tree),又称二叉查找树(Binary Search Tree),亦称二叉搜索树. 一.定义 二叉排序树或者是一棵空树,或者是具有下列性质的二叉树: 若左子树不空 ...

  4. JS中的迭代器和生成器

    利用迭代器生成一个遍历方法: let arr1 = [1, 2, 3, 11, 22, 13, 24]; function forOf(arr, callback) { // 找到迭代器函数 let ...

  5. LINQ按多列分组(Group By)并计算总和(Sum) (转载)

    来源:https://codedefault.com/2018/group-by-multiple-columns-and-sum-in-csharp .NET[C#]LINQ按多列分组(Group ...

  6. There is no getter for property named 'PRODUCT_ID' in 'class java.lang.String'

    背景:心血来潮之际,准备搭建以下多月未曾碰触过的Mybatis框架,体验一番原生之美.殊不知能力有限,错误百出.特抒此文以纪念此坑.问题:想在sql管理中来统一处理一些简单的判断,但是添加判断之后参数 ...

  7. android studio创建模拟器

    开发环境: 操作系统: windows10 教育版 1903 Android studio :  Android Studio 3.5.1Build #AI-191.8026.42.35.590020 ...

  8. 7. Input and Output

    7. Input and Output There are several ways to present the output of a program; data can be printed i ...

  9. OSI标准协议分析

    1.各个层的作用 物理层:(physical Layer):物理层负责传送比特(Bit),涉及到接口和传输媒体的机械 电气特性 数据链路层:(data link layer):数据链路层负责传送的帧( ...

  10. linux系统编程面试题

    说明:所有题目均摘录于网络以及我所见过的面试题目,欢迎补充! 无特殊说明情况下,下面所有题s目都是linux下的32位C程序. 1.堆和栈有什么区别? (1)栈由操作系统分配和释放:堆则是程序员手动去 ...