记录零碎ACM小知识

  1. 整型数组元素数量不能超过1 * 107,超过了编译不会检查出错误,但是运行会崩溃。。。
  2. 取余运算符只能用在两个int型之间。
  3. #include <cmath> float  fmod (float x, float y)            功能计算x / y的余数。可以在%用不了的情况下尝试下
  4. 两个数的位数分别为a, b, 则两个数相乘后的数位为a + b - 1。
  5. 一个包含所有c++的头文件:#include <bits/stdc++.h>。但不推荐使用,因为会浪费时间
  6. map<a, b> mp中是依靠关键字有小到大排序的,即依靠a。
  7. 有时候你可能会看到有些程序不使用方便的"using namespace std;"命令语句。为什么不直接使用"using namespace std;"比较简便?因为这样对于比较大的程序来
    说不是很好的习惯,因为使用这句话虽然简便了,但是这样导致把std命名空间的所有标准库函数都引进到程序文件里,这样如
    果以后程序涉及到同名函数名或变量名,将会出现难以调试的错误。

  8. 非全局数组,即定义在函数内部的数组(如main函数)需要手动进行初始化。而全局数组系统会自动初始化,一般会默认初始化为0。如int数组将每个变量初始化为0, 全局布尔数组将每个元素默认初始化为0。(参考处:https://blog.csdn.net/zzlu_88888/article/details/83303656
  9. 判断是否为素数的函数
    1 bool isPrime(int x) {
    2     if (x <= 1) return false;
    3     if (x == 2) return true;
    4     if (x % 2 == 0) return false;
    5     for (int i = 3; i * i < x; i += 2) {
    6         if (x % i == 0) return false;
    7     }
    8     return true;
    9 }
  10. 设s是一个字母,那么语句"s ^= 32;" 便可以把当前字母从小写变成大写又或者把大写变成小写。计算机异或运算如:0 ^ 0 = 0; 0 ^ 1 = 1; 1 ^ 0 =  1; 1 ^ 1 = 0;eg:'A' 是65,二进制码:‭01000001‬,‘a’是97,二进制码:‭01100001‬。所以‘a’ - ‘A’ == 32,32 == 25,异或运算符会把s的从右到左的第5位二进制数与32的第5位二进制数即1 进行异或运算, 若s == ‘A’ 则第5位二进制数为 0, 异或运算后结果变为1,相当于加了32。若s == ‘a’则第5位二进制数为1,异或运算后结果变为0, 相当于减了32。
  11. 深搜模板
     1 int search(int t)
     2 {
     3     if(满足输出条件)
     4     {
     5         输出解;
     6     }
     7     else
     8     {
     9         for(int i=1;i<=尝试方法数;i++)
    10             if(满足进一步搜索条件)
    11             {
    12                 为进一步搜索所需要的状态打上标记;
    13                 search(t+1);
    14                 恢复到打标记前的状态;//也就是说的{回溯一步}状态恢复,回溯算法的话,一定要注意恢复现场,要保证每一次递归下去的时候我们的状态都是正确的
    15             }
    16     }
    17 }
  12. 个数是指数级别的,凡是指数级别的问题呢,要枚举出所有方案的话,就得要用递归+回溯的方式来做
  13. 想要debug递归函数的话,需要在递归函数语句里面设置断点
  14. 以上为《算法竞赛宝典 语言及算法入门》P89内容。
  15. random函数不是ANSI C标准,不能在gcc,vc等编译器下编译通过。但在C语言中int random(num)可以这样使用,它返回的是0至num-1的一个随机数。

     可改用C++下的rand函数来实现。

    rand()%n   范围  0~n-1

    rand()主要是实现 产生随机数,其他我们在这里可以无视他

    显然任意 一个数  rand()%n  范围显然是  0~n-1;

    那么 如何产生 n~m的数呢? 一样的   我们只要对rand()进行一些 符号操作就行了;

    n+rand()%(m-n+1);    这样就可以了

  16. 排列与组合的异同
    一、是否按次序排列
    
    1、排列:从n个不同的元素中,取r个不重复的元素,按次序排列,称为从n个中取r个的无重复排列。 
    
    2、组合:从n个不同的元素中,取r个不重复的元素,组成一个子集,而不考虑其元素的顺序,称为从n个中取r个的无重组和。
    
    二、符号表示不同
    
    1、排列A(n,r)
    
    2、组合C(n,r)
  17. 异或运算符
     位运算符家族中,最常用的,莫过于异或运算符。
    
    异或运算符是指: 参与运算的两个值,如果两个相应位相同,则结果为0,否则为1。即:0^0=01^0=10^1=11^1=0
    
    例如:10100001^00010001=10110000
    
    0^0=0,0^1=1    可理解为: 0异或任何数,其结果=任何数
    
    1^0=1,1^1=0    可理解为:1异或任何数,其结果=任何数取反
           
    
    任何数异或自己,等于把自己置0
    
    1)按位异或可以用来使某些特定的位翻转,如对数10100001的第1位和第2位翻转,可以将数与00000110进行按位异或运算。
      10100001^00000110=10100111 
    
         用十六进制表示: 0xA1 ^ 0x06 = 0xA7
    
    (2)通过按位异或运算,可以实现两个值的交换,而不必使用临时变量。例如交换两个整数a,b的值,可通过下列语句实现:
    
       a=10100001,   b=00000110
    
        a=a^b;   // a=10100111
    
        b=b^a;   // b=10100001
    
        a=a^b;   // a=00000110
    
    (3)异或运算符的特点是:数a两次异或同一个数b(a=a^b^b)仍然为原值a。(实现两个值的交换正是用到了这点)
    ————————————————
    原文链接:https://blog.csdn.net/duji_160/article/details/76533334
  18. 将g数组完全赋值到backup数组,即给a数组做一个备份:memcpy(backup, g, sizeof g);
  19. 输出换行格式的简写:puts("");
  20. 一维动态规划时间复杂度一般有O(n)和O(n^2)两种,时间复杂度取决于状态转移方程。
  21. sort排序pair类时,会先以第一个关键字排序,第一个关键字相同时,再以第二个关键字排序。
原文地址:https://www.cnblogs.com/theSunAndSnow/p/11754652.html