• ​​简单行程​​
  • ​​学到了什么​​
  • ​附件​
  • ​​测程序内存占用​​
  • ​​一个常见错误​​
  • ​​scanf的巧妙用法​​
  • ​预编译的巧用​
  • ​​用法一​​
  • ​​用法二​​


简单行程

  还有必要讲吗?还是要讲讲的。今天搞了件大事(xin)情(wen),不过讲出来不太好,就不讲了,大致就是黑客干的那些事。

学到了什么

  说实话,今天学到了不少,感觉自己的世界观都被改变了,在此和大家分享。

  1. DP的单调性优化有两种方法:斜率优化和四边形不等式。
  2. vector、stack、queue比较慢,考试时最好自己写。
  3. 双端队列,最好也自己写,经典应用:滑动窗口。
  4. 测程序内存占用的两种方法(详情见附件)
  5. 不要用float,用double,用float不如用int。
  6. 可以使用C++自带的priority_queue,不需要自己写。
  7. 自带的priority_queue默认是最大优先队列,要想实现最小优先队列,不必使用greater,可以将存入的数据改为其相反数,取出时在改过来即可。十分巧妙。
  8. 传址比传值快。
  9. 在C++自带的priority_queue中放结构体时,结构体要重载小于号。
  10. 一个常见错误。(详情见附件)
  11. scanf的巧妙用法(详情见附件)。
  12. 预编译的巧妙用法(详情见附件)。
      不多讲,直接看附件。

附件

测程序内存占用

  第一种,用MinGW自带的size.exe工具,如图:

北京信息学培训第四天_培训


具体使用方法:将你的程序放在该目录下,在该目录下打开cmd,输入如下命令:

size.exe [您的程序名字]

效果如图:

北京信息学培训第四天_信息学_02


红框中是内存大小,前者是十进制,后者是十六进制,单位是字节。

不过值得注意的是,这算的只是程序的静态内存,什么是静态内存?就是在函数外部定义的变量和数组,举个例子:

int out[1000];//这是静态内存
int main(){
int in[1000];//这是动态内存
return 0;
}

一个常见错误

  这是什么神奇的错误呢?先上代码:

char c[1000];
for(int i=0;i<strlen(c);i++){

}

有什么问题?strlen()也是需要计算时间的,这样放在循环里,会重复计算多次,导致时间复杂度增加,正确写法:

char c[1000];
int x=strlen(c);
for(int i=0;i<x;i++){

}

scanf的巧妙用法

举个例子,如果我们要读入两个日期,然后计算他们之间有多长时间,该怎么读?比如:

1989-06-24 00:00:00

字符串处理?那你就out了!正确读法:

scanf("%d-%d-%d %d:%d:%d",&year,&month,&day,&hour,&minute,&second);

惊不惊喜?意不意外?就是这么神奇。

预编译的巧用

用法一

scanf虽然神奇,但在读取long long型数据时,比较麻烦,为什么?因为在不同平台下,用的格式控制不一样:

WIN32 %I64d
Linux %lld
WIN64 %I64d %lld

那么我们该怎么办呢?
我们可以这样处理:

#ifdef WIN32
#define LL "%I64d"
#else
#define LL "%lld"
#endif
int main(){
long long x;
scanf(LL,&x);
return 0;
}

相当的巧妙。

用法二

网上测评往往用的是标准输入输出,但我们自己测试通常用文件,切换很麻烦,所以我们也可以用预编译来处理:

int main()
{
#ifdef ONLINE_JUDGE
;
#else
freopen("in","r",stdin);
freopen("out","w",stdout);
#endif
return 0;
}