PAT上机细节补充
万能头文件
include <bits/stdc++.h>
在字符串练习中,来计算a+b,可以采用的方法是用string接收,再用stdlib.h中的atoi(str)函数将string转为int类型数,但是pat中无法使用itoa()函数来将数转为字符串,这样情况下就需要使用sscanf和sprintf函数来操作。
当要接收字符串包含空格的时候,可以使用getline(cin,str)但是注意如果在这之前有要求输入一个n代表后续还要输入n行时,scanf("%d\n",&n)这个换行符必须有,否则getline()会连换行符一起输入,还有熟悉string容器的一些调用函数包括str.substr()切割子串等很实用的函数
STL的size用法注意一定要将 s.size() 先转为整型数,再进行解法。一定要形成这样的习惯,一旦 size() 后面要减去数字时,先转为 int 型,因为 size() 的返回值是无符号型,一旦减去一个比自己大的数字,则会出错
使用队列的时候涉及到q.size()时候都提前用变量保存好因为后面肯定要出队入队 队列内元素个数会变化 很容易出错
string转double方法 stod()
四舍五入的方法是round()
cctype字符文件处理库
isalnum() 如果参数是字母数字,即字母或者数字,函数返回true
isalpha() 如果参数是字母,函数返回true
iscntrl() 如果参数是控制字符,函数返回true
isdigit() 如果参数是数字(0-9),函数返回true
isgraph() 如果参数是除空格之外的打印字符,函数返回true
islower() 如果参数是小写字母,函数返回true
isprint() 如果参数是打印字符(包括空格),函数返回true
ispunct() 如果参数是标点符号,函数返回true
isspace() 如果参数是标准空白字符,如空格、换行符、水平或垂直制表符,函数返回true
isupper() 如果参数是大写字母,函数返回true
isxdigit() 如果参数是十六进制数字,即0-9、a-f、A-F,函数返回true
tolower() 如果参数是大写字符,返回其小写,否则返回该参数
toupper() 如果参数是小写字符,返回其大写,否则返回该参数
当输入输出用cin和cout比较多的时候
cin.tie(0)给cin加速
如果是10^9的数据 那么最好用long long
stod() 可以将string类型转换为double 但是 dev编译器中不能通过而pat中可以,而且该方法在string.h包中,也可以用csdlib库中的atof(char *)。
string要转long long 可以用stoll()或者cstdlib包下的atoll(char *str)
如果结构体中的char类型的字符串数组name[25] 需要直接在接收的时候结构体名.name赋值不能,或者先用一个字符串数组接收再赋值。
有时候关于浮点数的数据 有可能一开始一个个累加的时候就要转化成int型
也有可能是加到最后转成int
在set容器要使用find来配合搜索功能比起再用,map效率是相对较低的。
cin后用scanf收%s 要吸掉空格
2个正数相加溢出是<0 2个负数相加溢出是>=0
接收long long 最好用scanf 有题目因为cin接收一直有数据点不过!
有时候树这一块id可能大于单位数 '-'代表空结点 但是需要用string来接受 如果“11” char接收不了
vector
二维数组vector<vector
double类型取模用函数 fmod(double d1,double d2)返回double值
0去模以任何数都会报浮点错误
平方探测法是0<i<=Tsize
str.substr(start,len)
在STL容器的方法重载这,可以统一使用友元重载符
struct node {
用于set的运算符重载
int a,b,c,d;
bool friend operator<(node x,node y) {
if(x.a<y.a) return true;
if(x.a==y.a&&x.b<y.b) return true;
if(x.a==y.a&&x.b==y.b&&x.c<y.c) return true;
if(x.a==y.a&&x.b==y.b&&x.c==y.c&&x.d<y.d) return true;
return false;
}
} code[1005],ip[55];
set.begin()返回的是指针 *set.begin()可输出值
math 包下
fabs(double x) --绝对值
floor(double x)--向下取整 ceil (double x)--向上取整
asin(double x)--反正弦函数
round(double x)--四舍五入取整
组合数
int cal(int n,int p)
{
int ans=0;
while(n)
{
ans+=n/p;
n=n/p;
}
return ans;
}
变形:求n!末尾有多少个0,实质上cal( 10,5 )
algorithm 中的
lower_bound(first,last,val) 返回[first,last)内第一个值大于等于val的位置
upper_bound(first,last,val)返回[first,last)内第一个值大于val的元素位置
编程时间复杂度的要求细则:
N~16: 可以用指数O(2^N)的算法
N~100: 指数算法会爆炸,必须要用多项式算法。
N~500: 时间复杂度不能高于O(N^3)
N~2000: 时间复杂度不能高于O(N^2)
N~10^5: 时间复杂度不能高于O(N log N)
N~10^9: 时间复杂度必须为O(log N)或者 O(sqrt(N))
有那么一个公式,就是你的总计算次数不能超过10^7数量级,否则就会超时。这个在任何的编程竞赛中都适用。