- 简单行程
- 学到了什么
- 附件
- 测程序内存占用
- 一个常见错误
- scanf的巧妙用法
- 预编译的巧用
- 用法一
- 用法二
简单行程
还有必要讲吗?还是要讲讲的。今天搞了件大事(xin)情(wen),不过讲出来不太好,就不讲了,大致就是黑客干的那些事。
学到了什么
说实话,今天学到了不少,感觉自己的世界观都被改变了,在此和大家分享。
- DP的单调性优化有两种方法:斜率优化和四边形不等式。
- vector、stack、queue比较慢,考试时最好自己写。
- 双端队列,最好也自己写,经典应用:滑动窗口。
- 测程序内存占用的两种方法(详情见附件)
- 不要用float,用double,用float不如用int。
- 可以使用C++自带的priority_queue,不需要自己写。
- 自带的priority_queue默认是最大优先队列,要想实现最小优先队列,不必使用greater,可以将存入的数据改为其相反数,取出时在改过来即可。十分巧妙。
- 传址比传值快。
- 在C++自带的priority_queue中放结构体时,结构体要重载小于号。
- 一个常见错误。(详情见附件)
- scanf的巧妙用法(详情见附件)。
- 预编译的巧妙用法(详情见附件)。
不多讲,直接看附件。
附件
测程序内存占用
第一种,用MinGW自带的size.exe工具,如图:
具体使用方法:将你的程序放在该目录下,在该目录下打开cmd,输入如下命令:
效果如图:
红框中是内存大小,前者是十进制,后者是十六进制,单位是字节。
不过值得注意的是,这算的只是程序的静态内存,什么是静态内存?就是在函数外部定义的变量和数组,举个例子:
一个常见错误
这是什么神奇的错误呢?先上代码:
有什么问题?strlen()也是需要计算时间的,这样放在循环里,会重复计算多次,导致时间复杂度增加,正确写法:
scanf的巧妙用法
举个例子,如果我们要读入两个日期,然后计算他们之间有多长时间,该怎么读?比如:
1989-06-24 00:00:00
字符串处理?那你就out了!正确读法:
惊不惊喜?意不意外?就是这么神奇。
预编译的巧用
用法一
scanf虽然神奇,但在读取long long型数据时,比较麻烦,为什么?因为在不同平台下,用的格式控制不一样:
WIN32 %I64d
Linux %lld
WIN64 %I64d %lld
那么我们该怎么办呢?
我们可以这样处理:
相当的巧妙。
用法二
网上测评往往用的是标准输入输出,但我们自己测试通常用文件,切换很麻烦,所以我们也可以用预编译来处理: