acm总结(一)

;const double pi = acos(-1.0)

;long long在Linux下的输入输出格式符为%lld,但windows平台中有时为%I64d

;scanf函数返回的是成功输入的变量个数

;比较大的数组应尽量声明在main函数外,这样才可以开的尽可能大

;void *memcpy(void *dest,const void *src,size_t n),从源src所指的内存地址的起始位置开始拷贝n个字节到目标dest所指的内存地址的起始位置

所需头文件<string.h>、<cstring>

;char *strchr(const char * s,char c),查找字符串s中首次出现字符c的位置

所需头文件<string.h>、<cstring>

;不同操作系统的回车换行符是不一样的,Windows是\r\n,Linux是\n,MacOS是\r

;ctype.h  isalpha isdigit isprint是否为字母,数字,可打印字符. toupper tolower 转换大小写

;为了使用方便,往往用“typedef struct{域定义;}类型名;”的方法定义一个新类型名。这样,就可以像原生数据类型一样使用这个自定义类型。typedef struct{ double x, y;}Point;

;2的32次方-1 为 4294967295

;-n的内部表示法是2的32次方-n

;int is_prime(int n)
{
    if(n <= 1) return 0;
    int m = floor(sqrt(n)+0.5);
    for(int i = 2; i <= m; i++)
        if(n % i == 0)return 0;
    return 1;
}使用m,一方面避免了每次重复计算sqrt(n),另一方面也通过四舍五入避免了浮点误差

;++运算符的优先级高于“取内容”运算符*

;可以把string作为流进行读写,定义在sstream头文件中
while(getline(cin, line)){
    stringstream ss(line);
    while(ss >> x)
        sum += x;
}

;vector头文件中的vector是一个不定长数组,可以用clear()清空,resize()改变大小,用push_back()在尾部添加元素,用empty()测试是否为空,pop_back()删除最后一个元素,erase()删除某位置或区间的数据,传回下一个数据的位置

;set是数学上的集合——每个元素最多出现一次,而且已经从小到大排好序了

;STL的queue头文件提供了优先队列,用“priority_queue<int>s”方式定义,用push()和pop()进行元素的入队和出队操作,top()取队首元素(但不删除),整数越小优先级越低(默认)。越小的整数优先级越大的优先队列可以写成“priority_queue<int, vector<int>,greater<int> >pq”.

;随机数发生器的核心函数是cstdlib中的rand(),它生产一个闭区间[0,RAND_MAX]内的均匀随机整数,其中RAND_MAX至少为32767.需要随机数的程序最开始一般会执行一次srand(time(NULL)),目的是初始化“随机数种子”.执行rand()之后先除以RAND_MAX,得到[0,1]之间的随机实数,扩大n倍后四舍五入,得到[0,n]之间的均匀整数。

;把vector作为参数或者返回值时,应尽量改成用引用方式传递参数,以避免不必要的值被复制

;给定一棵包含2的b次方个结点(其中d为数的高度)的完全二叉树,如果把结点从上到下从左到右编号为1,2,3。。。,则结点k的左右子结点编号分别为2k和2k+1

;当题目比较复杂时,建议先手算样例或者至少把样例的图示画出来,以免误解题意

;DFS遍历和BFS遍历,前者用递归实现,后者用队列实现。求多维数组连通块的过程也称为种子填充

;根据连通性和度数可以判断出无向图和有向图是否存在欧拉道路和欧拉回路。可以用DFS构造欧拉回路和欧拉道路

;fill函数,fill(arr, arr+n, 要填入的内容)

头文件<algorithm>

;upper_bound 和 lower_bound,在一个左闭右开的有序区间里进行二分查找,需要查找的值由第三个参数给出。

upper_bound返回的是被查序列中第一个大于查找指的指针。

lower_bound返回的是被查找序列中第一个大于等于查找指的指针。

拥有重载函数,可以接受第四个参数(greater<Type>())。则返回小于或小于等于。

前者得是非递减,后者非递增。

;next_permutation函数 prev_permutation,求一个排序的下一个排列函数,可以遍历全排列。

bool next_permutation(iterator start, iterator end)

;std::ios::sync_with_stdio(false); 关闭同步,提高输入输出的速率

;setprecision,cout << setprecision(位数) << 变量 << endl;

头文件<iomanip>

;c++ string字符大小写的转换,通过algorithm中的transform函数对string对象进行字符的大小写转换

transform(str.begin(), str.end(), str.begin(), ::toupper);

transfrom有四个参数,字符串的起始地址,终止地址,转换之后输出到原str字符串的起始地址,转换操作可以选择toupper,tolower

;在for循环枚举时不要把循环条件写成i<strlen(str),因为strlen内部实现就是使用一个循环扫描数组来累计长度的。

;读入字符串时,最好不要用scanf,遇空格就停止,可以使用gets函数直接读入一行,或者使用getchar()读入一个字符,直到'\n'为止。

;str.find("2012", 0) == string::npos

;mid = (left+right)/ 2中的left+right有可能超过int溢出,可以使用mid=left+(right-left)/ 2代替

;if(b%2==1)可以用if(b&1)代替,执行速度会更快

;字符串转数值,头文件sstream

void s2i(string &str,int &num)
{
    stringstream ss;
    ss << str;
    ss >> num;
}

;%*c作用时读取输入流中数字后的一个字符,并丢弃,使得后面的输入函数不能读到那个字符 跳过一个字符

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

想名字好难啊竟然不止我一个

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值