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 A[MAXN] 有时候无法用 A[0].某个属性 除非是vector A(MAXN)进行初始化

二维数组vector<vector > sq;

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数量级,否则就会超时。这个在任何的编程竞赛中都适用。

posted @ 2021-03-09 19:40  coderJ_ONE  阅读(73)  评论(0编辑  收藏  举报