读书笔记-算法竞赛入门经典(天坑)
本文发布于 1586 天前,最后更新于 1457 天前,其中的信息可能已经有所发展或是发生改变。

日常挖坑,看了看友人博客,一堆读书笔记,所以,跟着弄一弄。

不过因为不是文科生,写文章啥的太难了,所以,说是写笔记,其实是整理一些紫书上的个人认为有价值的小Tips

然后,因为现在用的是ChromeBook,Chrome OS 下的中文输入法难使的要命,所以更新大概就是咕咕咕吧(逃

笑,今天在 Chrome OS 下的 Crostini 虚拟 Arch Linux ,并通过 Fcitx 和 Typora 实现了极度舒适的输入环境!

第一章 程序设计入门

1.1 算数表达式

  1. 在”整数-浮点数=浮点数”操作时,计算机内先讲整数转换为浮点数,再进行”浮点数-浮点数”计算。

1.2 变量及输入

  1. 在算法竞赛中,每行输出均应该以回车符结束,包括最后一行。

除非特殊说明,每行的行首不应该有空格,但行末通常可以有多余空格。

  1. 赋值是个动作,先计算右边的值,再赋值给左边的变量。
  2. C语言的printf中,只有以”%”开头的部分才会被后面的值替换掉,其余部分原样输出。

1.3 顺序结构程序设计

  1. 利用printf 输出添加前缀0的方法,讲输出格式设置为”%0Xd”格式(X代表输出总位数,不足部分以零补全)。
  2. 交换变量的一种方法(无实际价值,作为扩展开阔眼界)
a = a + b; // 先利用a记录a,b之和
b = a - b; // 变量b等于a,b之和减去b值(即a+b-b),实现交换
a = a - b; 
  1. 算法竞赛的目的是解决问题,而不是为了写程序而写程序,同时应该保持简单(Keep Is Simple and Stupid,简称KISS),而不是自己创造条件去展示编程技巧。

1.4 分支结构程序设计

  1. C-like 类语言中的逻辑运算符都是短路运算符。一旦能够确定整个表达式的值,就不继续计算。

1.5 注释与习题

第二章 循环结构程序设计

2.1 for 循环

  1. continue 是指调回 for 循环的开始,执行一奥正语句并判断循环条件(即“直接进行下一次循环”)。

2.2 while 循环和 do-while 循环

2.3 循环的代价

  1. 在计算只包含加法、减法和乘法的整数表达式除以正整数 n 的余数,可以在每步计算之后对 n 取余,结果不变。
  2. 剪枝小技巧(适用简单难度的小题目),可能在循环中某一项开始后的所有结果都不影响在输出位数内的数字值,那么在此进行特判,以解决效率和溢出问题。
  3. Linux 在默认情况下,当前目录不在可执行文件(一般为/bin)的搜索路径中,所以运行当前目录下的可执行文件需要 “./XXX” 形式运行。

2.4 算法竞赛中的输入输出框架

  1. scanf 函数有返回值,返回成功输入的变量个数。
    while(scanf("%d",&x)==1) // 当输入结束时,scanf 函数无法再次读取x,将返回 0
    
  2. 使用文件最简单的方法是使用输入输出重定向,只要在 main 函数的入口处添加一下两条语句
    freopen("input.txt","r",stdin);
    freopen("output.txt","w",stdout);
    // 此语句将所有读键盘输入、写屏幕输出的函数都将改用文件
    
  3. 一种方法可以在本机测试时使用文件重定向,一旦提交到比赛,就自动“删除”重定向语句。
    #define LOCAL
    #define < stdio.h>
    #define INF
    
    int main() {
    #ifdef LOCAL
      freopen("data.in", "r", stdin);
      freopen("data.out", "w", stdout);
    #endif
      int x, n = 0, min = INF, max = -INF, s = 0;
      while (scanf("%d", &x) == 1) {
        s += x;
        if (x < min)
          min = x;
        if (x > max)
          max = x;
        /*
            printf("x = %d, min = %d, max = %d\n", x, min, max);
        */
        n++;
      }
      printf("%d %d %.3f\n", min, max, (double)s / n);
      return 0;
    }
    

    重定向部分被写到了 #ifdef 和 #endif 中,其含义是:只有定义了 LOCAL 才编译其中语句。

    注释语句用作调试。

    提交代码是只需删掉 #define LOCAL 即可。

  4. 鲁棒性(robustness)今天先写到这为止,剩下的慢慢补充。

评论

  1. Windows Chrome 97.0.4692.71
    4 年前
    2022-1-13 0:58:33

    不知道在这评论能不能被看到 emmm
    给出一个刚刚琢磨出来的比较优雅的输入重定向方案:

    stringstream fcin(R"(2
    1 2 3
    4 5 6)");
    istream std::cin(fcin.rdbuf());

    好处是不用另开文件,坏处是只能重定向 cin 不过我只用 cin 反正关同步也够快了 hhhhh

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇