2.23、2.25、2.26、2.27、2.28
General:
1,<抄>建议:不要违背题解的思路好吗 累了。
2, 小错误~易错点~
改为
3,某测试点错误原因:还可能是定义的数据类型的长度不够。
如int应该改为long long、int q[100]不够,应该至少是q[201]。
4,三指针不多见哦~
5,“指针不走回头路~”
6,思想方式:
都是一个指针不动,其他指针动,直到走到某个位置(自己根据题目设定),接着处理计数啥的;
之后把这个指针移动一个单位,其他指针动,直到走到某个位置(自己根据题目设定),接着处理计数啥的;
重复上述步骤~
7,500道洛谷,就差不多啦~
双指针笔记:
双指针并不是数据结构,也不是指C这种语言中的指针,而是一种解题思想,是一种简单的技巧,通过两个指针维护一些具有单调性、可快速增删的区间信息。
很多时候双指针的题,会有多种解法,但双指针解法往往是最清晰易懂的解法。双指针可用来提高效率,一般是将O(n^2)的时间复杂度,降为O(n)。
双指针算法是指在遍历对象的过程中不是普通的使用单个指针进行访问,而是使用两个相同方向(快慢指针)或者相反方向(对撞指针)的指针进行扫描,从而达到相应的目的。
核心思想:优化暴力(一般都是把暴力O(n^2或更多)优化到O(n))
for(int i = 1; i <= n; i ++)
{
while(j <= i && check(i, j))
{//check函数用来判断i,i 区间可不可取
j ++;
}
//题目的具体逻辑
}
C:\Users\LQH!\Desktop\双指针
一、P1102 A-B 数对 100/100
题目:
<第一版><抄>建议:不要违背题解的思路好吗 累了。
mine:
题解:
<第二版>·双指针的拓展-》三指针 100/100
思路:A为a[i]时,使得在b1和b2之间的都是对应的B值。
问题一:小错误~易错点~
修改后:
问题二:数组长度不够
而我
修改后.全对~
问题三:之前做这题的时候老是错一个测试点,得92/100分
原因:“满足A−B=C 的数对的个数”使用int类型,不够,应该换成long long
二、AcWing800数组元素的目标和 未知得分
·对撞指针
题目:
三、AcWing1236递增三元组 未知得分
三指针
题目:
学习题解:
方法妙啊!
由暴力的方法,看出对b数组是公用的,选择b数组进行枚举,作为枢纽
for (int a = 1, b = 1, c = n; b <= n; b++)
{
while (a <= n && A[a] < B[b])
a++;
while (c >=1 && B[b] < C[c])
c--;
res += (a - 1) * (n - (c + 1) + 1);
}
四、P3143 [USACO16OPEN] Diamond Collector S
题目:
问题一:情况:30/100 不断debug后发现原因:同一个钻石不能放在两个架子上。我当然知道,但是在有些测试数据下,我的代码,会将同一个钻石放在两个架子上~~所以测试数据答案为473,而我的答案为481,偏大了~
呜呜呜 是不是要想想完全,再开始写代码吗?比如要想到怎么放置两种大小的钻石~
修修改后:想不到。只能通过积累~
arr_lr记录的是以这个数组为结尾,往前到开头,一个架子最多放几个钻石
arr_rl记录的是以这个数组为开头,往前到结尾,一个架子最多放几个钻石
问题二:for的停止循环条件写错了~~离谱答案50010 正确答案为5 好像是30/100
修改后: