以下是我个人OI生涯中遇到的坑点的一个小总结,可能是我太菜了,总是掉坑里,请大佬勿喷

1,多重背包的转移的循环顺序

//默认每个物品体积为一(不想打码……)
//dp[i]表示占用背包容量i所能获得的最大价值
for(int i=;i<=n;i++)
for(int j=sum;j>;j--) //sum表示背包最大容量
for(int k=;k<=num;k++) //num表示这个物品的数量,k表示选取当前物品k件
if(j>=k)
dp[j]=min(dp[j],dp[j-k]+value);

简单的多重背包模板,对于学过的人,大概清晰易懂吧

//dp[i]表示占用背包容量i所能获得的最大价值
for(int i=;i<=n;i++)
for(int k=;k<=num;k++) //num表示这个物品的数量,k表示选取当前物品k件
for(int j=sum;j>k;j--) //sum表示背包最大容量
dp[j]=min(dp[j],dp[j-k]+value);

很相似的代码,只是改了循环顺序,但是为什么会错呢?

类比01背包的倒序转移,

考虑对于某种物品,标程中先枚举 j ,再枚举 k ,这样对于每个位置 j ,只能先于位置 j - i ,由 j - i ( i ∈ [ 0 , k ] )转移一次

而错误写法中,对于位置 j ,可以由转移过的位置 j - i 转移而来

这为什么会导致错误呢?考虑在 j 之前, j - i 已经由 j - i1 - i2 转移而来,多重背包的物品是可以组合的,所以以上的转移等价于 dp[ j - i1 - i2 ] 直接转移到 dp[ i ] ,而我们不能保证 i1 + i2 <= num ,即可能会取多于物品总数的物品

举个例子:

物品数量为7,我们枚举位置13,由8转移而来,而在此之前,位置8由4转移而来,等价于位置13由位置4转移而来,13-4=9>7,转移非法

2,对拍fc玄学错误

因为样例普遍太水,对拍就成为了信息学竞赛中的经典调试手段

其中对比标准答案与你的程序的答案时,常用到fc,就是文件比较

考场上建议写对拍程序用system来回跑直到出错,再把错误数据拎出来用cmd跑,因为cmd会告诉你所有不一样的地方

但是有时候会遇到这样的问题:

人眼看都一样,文件比较就是不一样

在怀疑程序写崩开始乱改之前,不如看看是不是遇到了下面几种情况

(1)先看看这个

这是换行符的问题,你的程序可能比标程的答案差几个换行符,不多解释,考虑到这种问题的可能就好

(2)还有这个

这个甚至拿出来看都一样,有心人还会发现错误总在输出结尾,但是看到程序结尾一模一样,其实这是行末空格的问题(╯°Д°)╯︵┻━┻……

3,矩阵压缩重复

矩阵压缩???好啦,其实我也不知道叫什么了,所以给它起了这个名字(*/ω\*)

大意就是,如果给你一个矩阵n<=50000,m<=50000,开数组显然是开不下的,如果再给一个条件n*m<=500000呢,普通的二维数组还是布星,所以我们使用vector使用一维数组

把矩阵的一个位置转到一维数组上

我喜欢这么转,对于n行m列的矩阵,位于第i行第j列的元素的pos=(i-1)*m+j

这样就把矩阵上的每个位置转为1~n*m的

但是前提是你不会使用位置0,如果你使用了位置0还用这个映射

那么你会发现,本行第一个元素和上一行的最后一个元素pos值相等(在线出锅)

所以就要用pos=(i-1)*(m+1)+j了

同理,使用第0行就是pos=i*(m  or  m+1)+j

ps:我在这出锅倒是没有调太久,但是还是因为这个WA了好几次水题呢

4,树的直径合并

来看一个小题:给两棵树,我们可以在两棵树上任意两点之间连边,使这两棵树合并为一棵新树,求新树的最小直径

学过树的直径的同学都知道,lennewtree=(lentree1+1)/2+(lentree2+1)/2+1

式子没错,但是拿不到分,为什么呢

考虑其中一棵树的直径远大于另一棵,

所以我们知道了,完整的式子应该是这样的

lennewtree=max(max(lentree1,lentree2),(lentree1+1)/2+(lentree2+1)/2+1)

5,开数组

1,离散化数组

2,记得树状数组开数组是按值域开的

这样就一定要考虑开到极值

有这么一种情况,比如这个题,[SCOI2014]方伯伯的玉米田,我们树状数组的第二维是按高度开的,1<=ai<=5000,但是我们在运行过程中有把玉米拔高这么一种情况,有效的值域范围应为ai+k<=5500

6,如何避免低级错误

啊啊啊,这个东西这么好用,太好用了啊啊啊

dis[v=vc[i]]=min(dis[v],dis[x]+d2[i]);

看这行代码

是一个普通的dfs过程,但是错了

这个就涉及到运算优先级的问题了,因为它是从右向左算的

然后算到dis[v]的时候,v还没有赋值

v=vc[i];
dis[v]=min(dis[v],dis[x]+d2[i]);

这么写就对了

但是这种错是很难查的啊,怎么办呢?

其实我们可以在编译时解决这个问题:

这是个好东西,它可以在你代码里面找到可能的错误,以警告的形式提出来

OI中坑点总结的更多相关文章

  1. 浅谈分治算法在OI中的应用

    分治虽然是基本思想,但是OI中不会出裸分治让你一眼看出来,往往都是结合到找规律里面. 先来个简单的: 奇妙变换 (magic.pas/c/cpp) [问题描述]   为了奖励牛牛同学帮妈妈解决了大写中 ...

  2. [技术]浅谈OI中矩阵快速幂的用法

    前言 矩阵是高等代数学中的常见工具,也常见于统计分析等应用数学学科中,矩阵的运算是数值分析领域的重要问题. 基本介绍 (该部分为入门向,非入门选手可以跳过) 由 m行n列元素排列成的矩形阵列.矩阵里的 ...

  3. OI中常犯的傻逼错误总结

    OI中常犯的傻逼错误总结 问题 解决方案 文件名出错,包括文件夹,程序文件名,输入输出文件名  复制pdf的名字  没有去掉调试信息  调试时在后面加个显眼的标记  数组开小,超过定义大小,maxn/ ...

  4. GCC&&GDB在OI中的介绍

    序言 这本来是用Word写的,但是后来我换了系统所以只能用markdown迁移然后写了...... $\qquad$本文主要投食给那些在Windows下活了很久然后考试时发现需要用命令行来操作时困惑万 ...

  5. OI中的莫比乌斯反演

    OI中的莫比乌斯反演 莫比乌斯函数 想要学习莫比乌斯反演,首先要学习莫比乌斯函数. 定义 莫比乌斯函数用\(\mu(x)\)表示.如果\(x\)是\(k\)个不同质数的积,则\(\mu(x) = (- ...

  6. 浅谈OI中的提交答案

    在OI中,题目有三类: 传统题 交互题 提交答案题 今天来了解一下第三类 概述 传统题:给你一个题面,你需要交一个程序,评测姬会用你的程序运行你看不到的一些测试点,用输出和正确答案比较 提交答案题:给 ...

  7. OI中组合数的若干求法与CRT

    OI中组合数的若干求法与CRT 只是下决心整理一下子呢~ 说明:本篇文章采用\(\binom{a}{b}\)而不是\(C_{a}^b\),以\(p\)指代模数,\(fac_i\)指代\(i!\),\( ...

  8. OI中字符串读入和处理

    OI中字符串读入和处理 在NOIP的"大模拟"题中,往往要对字符串进行读入并处理,这些字符串有可能包含空格并以\n作为分割,传统的cin >> scanf() 等等,不 ...

  9. 浅谈OI中的底层优化!

    众所周知,OI中其实就是算法竞赛,所以时间复杂度非常重要,一个是否优秀的算法或许就决定了人生,而在大多数情况下,我们想出的算法或许并不那么尽如人意,所以这时候就需要一中神奇的的东西,就是底层优化: 其 ...

随机推荐

  1. JVM总结(六):早期(编译期)优化

    这节我们来总结一下JVM编译器优化问题. JVM编译器优化 Javac编译器 Javac的源码和调试 解析与填充符号表 注解处理器 语法分析与字节码生成 Java语法糖 泛型和类型擦除 自动装箱.拆箱 ...

  2. vue基础篇---vue组件

    vue模块第一篇,因为公司马上要用到这vue开发.早就想好好看看vue了.只有实际工作中用到才会进步最快.vue其他的简单指令就不多讲了,没啥意思,网上一大堆.看w3c就ok. 组件这个我个人感觉坑蛮 ...

  3. java实现Md5加密工具类

    场景:平常我们用户注册的密码保存到数据库都不会是明文存储的.都是经过加密之后的.因为保证用户的安全性.我们通常是用md5算法来加密的. 这个只能算是一个工具类.没必要了解里面是怎么实现的.拿来用就可以 ...

  4. windows单机环境下配置tomcat集群

    场景:我们在平常联系中,需要涉及到tomcat中,但是电脑不够怎么办,肯定是在自己的电脑上模拟集群,就是装多个tomcat,这时候需要稍微配置下.如果是多个服务器,那不用配置,直接怼!!! 这里介绍的 ...

  5. Win记录-配置Windows Server R 2008多用户远程连接(仅做参考)

    1.计算机管理下用户组下新建用户 2.系统属性下远程控制加入用户,设置允许运行任何远程桌面 3.运行->gpedit.msc->计算机配置->管理模板->windows 组件- ...

  6. liunx必知必会(2)

    一.SSH免密登陆配置 1.相关概念 SSH 为 Secure Shell(安全外壳协议) 的缩写. 很多ftp.pop和telnet在本质上都是不安全的,因为它们在网络上用明文传送口令和数据,别有用 ...

  7. 转--python 编码规范

    编程规范 1.1. 命名规范 1.1.1. [强制] 命名不能以下划线或美元符号开始和结尾 反例: name / __name / $Object / name / name$ / Object$ 1 ...

  8. 10 SpringBoot全面接管SpringMVC

    Spring Boot官方文档描述 If you want to keep Spring Boot MVC features and you want to add additional MVC co ...

  9. 通过read()读文件

    一.在POSIX中的定义 #include <unistd.h> ssize_t read(int fd, void *buf, size_t len); 二.调用read()的可能结果 ...

  10. Linux 查看文件编码

    查看某个文件的编码格式:使用 vi 编辑器 打开文件: 按 Esc 输入 ” : set fileencoding “ 就会显示出来 文件的编码格式 : set fileencoding