做题总结——连续更

星星之火,可以燎原

rush

  • ==星星之火,可以燎原==
    • 1. 关于保留小数取整方面的问题:
    • 2. Windows 模拟文件读入结束
    • 3. 字符串读取
    • 4. 很多题目需要用到初始化,我常用的有三种:
    • 5. 半径为 r 的圆内整点
    • 6. m*n的矩形中正方形的个数,03
      ②ceil函数向上取整为最接近的整数:-2.1,-2.9——>-2
      3.1,3.0——>4
      ③对浮点数的四舍五入 12.5——>13
      12.4——>12

      2. Windows 模拟文件读入结束

      ctrl + Z 可以模拟文件输入的结束即EOF

      3. 字符串读取

      对于字符串的情况,尤其是要读取空格,可以使用getline读取一整行。注意是不是应该加上getchar吸收换行。含有空格的字符串输出可以用gets(),自带换行

      4. 很多题目需要用到初始化,我常用的有三种:

      ①memset(数组名首地址,想要初始化的值,sizeof 初始化的范围)
      例如memset(num,0,sizeof(num));注意只能是初始化成-1,0,0x3f3f3f3f,0x3f3f 其余的十六进制没有试过
      ②fill(数组名首地址,初始化的范围,初始化的值);
      例如:fill(a,a+10,0);这个函数可以初始化成为任一值
      ③最最最保险的方法莫过于for循环,相对于以上两种方法估计还不会导致超时!!!==有的题目多组输入会因为每次进行初始化,消耗的时间会很长导致超时==

      5. 半径为 r 的圆内整点

      个数为1+4 * r+4 * ∑ ri=1sqrt(r * r - i * i)

      6. m*n的矩形中正方形的个数,0>n;
      getchar();
      getchar();
      getline(cin,string);
      Linux环境中的换行和win环境下的换行是不同的,当在acwing上测试代码的时候,不会出现正确的输出,而在win环境中测试以上样例的时候,得到的正是正确的输出,而判题姬是Linux环境的,所以容易被编译器演,所以一定要注意这种类型的输入。

      15. double | long double | __int128

      2020.8.15更
      小细节:
      %lf-----double
      %Lf------long double
      做题总结——连续更-每日运维
      __int128占用 16个字节

      16. n个点构成多少种树

      2020.8.17更
      n个点可以构成的不同的树有 n(n-2)种

      17. long long和double之间的范围大小和精度损失问题

      2020.8.30更
      long long 和double 在上面来看都是八个字节,每个字节是八位总共有64位,但是考虑到double 后面还有符号位,所以,对于整数部分,long long 是要比double要大一点的;附上大佬博客

      18. ull 自然溢出问题

      (2020.9.16更)
      在C++中,对于数据过大会发生溢出这种情况,导致得到负值或者是其他相差很大的数,但是用unsigned long long的时候,如果溢出,会发生自然溢出现象,如果所存储的数据范围大于 264 -1 ,会自动 取余 264 -1;

      19. C++ string查找是否存在某子串

      (2020.9.27 更)
      在C++中string的使用字符的子串的查找string.find() 与 string::npos
      如果在一个字符串如

      string s = "abcdefghijklmnopqrst";
      

      如若查找子串 “ghi”
      则要使用

      s.find("ghi");
      

      如若查找到,则返回的结果是所要查找的子串的第一个字母在主串中的下标
      如若没有查找到,则是一个很大的数,所以说,如果想要如果要判断这个字符串是否在主串中出现的情况,则要使用

      if(s.find("ghi") != string::npos)
      

      用法实例:
      在这里插入图片描述

      20 . 比较特殊的多组输入

      (2020.10.2更)
      如果要连续输入若干个数,而且这些数中可能会有很多个空格或者是换行,比如:
      做题总结——连续更-每日运维
      这时应该使用

      while(scanf("%d",&a[t])==1){
      }

      21. C++ string 的%s输出

      (2020.10.4更)
      很多时候在写代码的时候会用到string这种东西,但是却只能够用cout进行输出(如果强制使用printf输出会导致乱码),这就有可能被卡掉,而导致超时,无意之中看见了大神的代码
      发现string中有一个函数 c_str可以转换为用printf进行输出,瞬间感觉舒服了
      具体使用方法如下:
      :
      在这里插入图片描述

      22 . STL内存消耗问题

      2020.10.6更
      在做题的时候无缘无故的发现被卡了内存超限,然后在codeforces上叫了一下发现没问题,然后去找题目的内存限制,发现Codeforces上面的内存设置的大小是 512M,然后发现UPC平台上是128M,又改了一下代码,将用C++STL 中的map容器计数换位普通的数组之后,就很神奇的通过了这道题,后来去网上百度了一下map容器的内存问题,具体可见:
      知乎大神的回答
      CSDN某大神的回答
      发现map的内存消耗确实是个问题
      做题总结——连续更-每日运维
      做题总结——连续更-每日运维
      这样来说能不用STL就不用叭
      从容的看了看内存消耗,发现
      做题总结——连续更-每日运维
      在这里插入图片描述

      差距过大!!!!!

      22. 有关scanf()函数 返回值

      2020.10.24更
      有关scanf()函数 返回值的问题,比如要输入两个数a,b
      如果a和b都被成功读入,那么scanf的返回值就是2,如果只有a被成功读入,返回值为1,如果a和b都未被成功读入,返回值为0,如果遇到错误或遇到end of file,返回值为EOF。(经常用在多组输入里面)
      所以说scanf返回的就是已经读入的数的个数

      23. 有关lower_bound()进行查找的格式

      2020.12.04 更新
      有关lower_bound()进行查找的时候,格式如下:

      int ans =lower_bound(A,B,C) - firstpos;
      

      其中,A是起始点,B是终止点,C是要查找的数,firstpos顾名思义就是首地址
      用来查找第一个大于等于C的数对应的下标
      具体的方法如下:

      int ret = lower_bound(dp+1,dp+1+n,0x3f3f3f3f) - (dp + 1);
      

      上面的式子对应的数据及结果便是

      int ret = lower_bound(dp+1,dp+1+n,0x3f3f3f3f) - (dp + 1);
      printf("%dn",ret);
      for(itn i = 1;i