洛谷P1311 选择客栈
题意化简:寻找两个点a,b (ia<ib),满足color[a]=color[b] , price[c]<=max price (ia<=ic<=ib),求方案数
思路:枚举
题目给的范围n<=10^5,从而确定只能枚举一个点
易得方案数只与a,b的位置有关,与c无关,故枚举b点,寻找与b匹配的a的个数
- 对于color[a]=color[b],由题color count<=50,故设桶静态记录or动态记录颜色的个数,bclr[i][j]表示点区间[1, i ]中颜色为j的点的个数
int bclr[200010][60];
for(int j=0;j<clrc;++j)
bclr[i][j]=bclr[i-1][j];
++bclr[i][clr[i]];
- 对于price[c]<=max price (ia<=ic<=ib),确保每一对a,b均被选到,则c为离b最近的合法的点,记ok[i]为离i最近的合法点的编号
bool ok[200010];
if(prc[i]<=mxp)
ok[i]=i;
else ok[i]=ok[i-1];
- 对于答案的统计,由于bclr的定义(那么定义是为了方便状态转移),bclr可能会包括b点,但是b不能与自己匹配,故需特判
int ans=0;
for(int i=1,k;i<=n;++i){
ans+=bclr[ok[i]][clr[i]];
if(ok[i]==i)--ans;
}
总结
- 对于线性数据的维护可采用动态规划的思想,记录每个状态下的数据,通过上一次状态转移到本次状态
- 对于答案统计的偏差,可在统计之前除去,亦或是统计之后补齐
- 对于范围小(离散化),要求统计出现次数的数据,考虑桶
- 考虑从数据范围限制算法时间复杂度,形成雏形
洛谷P1074 靶形数独
题意化简:填数独,求最大得分
思路:爆搜加剪枝
正儿八经的数独
考虑限制搜索的广度,每行每列都不能选重复的,每一行未填的数字越多,组合的方案就越多,时间就越多,考虑优先搜索未填数少的,填完之后可以增加限制条件,从而更好筛选后续的方案,nx[i]为填完第i行后接下来填的行的编号
int nx[10],sq[10]={1,2,3,4,5,6,7,8,9,0};//初始的每一行
sort(sq,sq+9,cmp);//将每一行通过0的个数排序
for(int i=1;i<=9;++i)
nx[sq[i-1]]=sq[i];//记录下一行
dfs(sq[0],1);
if(sy==9)dfs(nx[sx],1);//搜索下一行
else dfs(sx,sy+1);
总结:对于方案数据之间存在限制,先搜与后搜导致时间效率不同的,考虑限制dfs的宽度,通过优先搜索可能方案种数少的来增添限制条件,加快后续方案的可行性筛选。
洛谷P1932 高精度全家桶
洛谷P2152 SuperGCD(高精gcd模板)
洛谷P1919 A*B Problem升级版(FFT快速傅里叶)
Ruby可过。
a = Integer(gets)
b = Integer(gets)
puts a * b
洛谷P1908 逆序对
求给定序列逆序对数量的模板题。
- 归并排序。
- 树状数组。
洛谷P1211 牛式
差点没想出来,只需枚举两个乘数即可,竖式里的其他数均可以由这两个数得到。
注意数有长度限制,以及第一位不能为 0 。
总结:枚举时考虑枚举的数据是哪些,考虑哪些数据可以由枚举的数据得到,从而确定最小的枚举范围,缩小时间复杂度。
洛谷B2006 地球人口承载估计
牛吃草问题。
设
w
w
w 为地球原有资源,
v
1
v_1
v1 为人消耗资源速度,
v
2
v_2
v2 为资源生长速度。
由题可列
{
a
x
=
w
+
a
v
2
b
y
=
w
+
b
v
2
v
1
≤
v
2
\begin{cases} ax=w+av_2\\ b y=w+bv_2\\ v_1 \le v_2\\ \end{cases}
⎩⎪⎨⎪⎧ax=w+av2by=w+bv2v1≤v2
可得
v
1
≤
v
2
=
(
a
x
−
b
y
)
a
−
b
v_1 \le v_2=\frac{(ax-by)}{a-b}
v1≤v2=a−b(ax−by)
贪心
填个坑。
二分答案
很多二分答案题都是带有贪心思想的。
关键词:最大值最小化,最小值最大化。
有时候需最小的最大值最大值是隐藏的,比如说很多人去抄一本书的结束时间是所花时间最多的人的结束时间。
洛谷P1281 书的复制
经典二分答案,跟数列分段很像。
要输出方案,按 c h e c k check check 函数思路分一遍即可。
要让后面的人抄的尽可能多。原来的 c h e c k check check 是 1 ∼ n 1\sim n 1∼n 正序枚举的,默认让前面的人抄的更多。所以 c h e c k check check 函数和输出方案时倒序枚举即可。
构造
洛谷P7285「EZEC-5」修改数组
x x x 为数组中最长连续 1 1 1 子段的长度, y y y 为修改的元素的个数,考虑修改操作的影响。
考虑贪心,对于最长的连续 1 1 1 子段 [ a , b ] [a,b] [a,b],将 b + 1 b+1 b+1 或 a − 1 a-1 a−1 处修改为 1 1 1,若没有和另外一处字段相连 ,则 x x x 增大 1 1 1, y y y 增大 1 1 1, x − y x-y x−y 不变,若和某处子段相连, x − y x-y x−y 定会比原来大。
所以全部修改为 1 1 1 即可。
本文总结了洛谷竞赛中涉及的多种算法问题,包括P1311选择客栈的动态规划、P1074数独的爆搜与剪枝、高精度计算和FFT应用等。通过实例展示了如何运用贪心、搜索策略、数据结构优化和桶的概念。
2181

被折叠的 条评论
为什么被折叠?



