这篇主要是讲刷题时候遇到的一些技巧,该篇保持持续更新状态。。
1、求数组的长度:int a[]={,,,}; int n = sizeof(a)/sizeof(a[0])
2、求想上取整,例如7/3 = 4; int res = a/b + !!(a%b);
3、求数组全排序,先对数组进行从小到大排序,然后do{ 对a数组进行操作}while(next_permutation(a,a+n));
4、背包问题时,求1到V之间的种数,由于用hash法再开一个数组,当数组过大时,内存会挂。因此用如下方法可以节约内存:(相关题目hdu2844)
(1)方法一:当费用与价值相等的时候。
int cnt = 0;
for(int v=1;v<=V;++v)
if(v==dp[v])
++cnt;
(2)方法二:使用刚好装满的思想去做,最后判断大于0的个数。
5、字符串初始化最好都为'\0',这样在使用的时候就不会出现由于末尾没加'\0',而出现乱码的情况了。
char str1[50]={'\0'},str2[50]="abcde";
for(int i=0;i<strlen(str1);++i)
str2[i] = str1[i];
//str2[strlen(str1))='\0'; 这句就不用加了。
6、使用Map<类型,int>时,如果判断是否添加过时有两种方法:
举例: Map<string,int> msi;
1、 pair<Map<string,int>:iterator,bool> pmb = msi.insert("张三",100);
判断pmb.second的值是否为true
2、直接判断msi[“张三”]的值是否为0(前提是你上一次赋值确保不是0)
7、在全局类的变量要大写,不然在提交代码后会出现编译不过的现象。例如:next,index这些变量,需要改成Next,Index。
8、二维数组置零不要int dj[10][10] = {0};没用!需要memset函数或者循环,不然只是第一行。