目录
由算法范围反推算法时间复杂度
直接复制粘贴
必背的数值
快速排序sort
C++基础操作:
c++字符串和整数相互转换
最大公约数与最小公倍数
一般ACM ,NOI(CSP)或者笔试题的时间限制是1秒或2秒。在这种情况下,C++代码中的操作次数控制在(10^7)为最佳。
下面给出在不同数据范围下,代码的时间复杂度和算法该如何选择:
n≤30,指数级别, dfs+剪枝,状态压缩dp
n ≤100 => O(n3), floyd,dp
n ≤1000 => O(n2),O(n2log(n)),dp,二分n ≤10000 => o(n√n),块状链表
n≤100000 =>O(nlog(n))=>各种sort,线段树、树状数组、set/map、heap、djkstra+heap、spfa、求凸包、求半平面交、二分
n≤1000000 =>O(n),以及常数较小的O(nlogn.)算法=> hash、双指针扫描、kmp、AC自动机,常数比较小的O(nlogn)的做法: sort、树状数组、heap、dijkstra、spfa
n ≤107 => o(n),双指针扫描、 kmp、AC自动机、线性筛素数n≤109=> o(√n),判断质数
n≤1018 => o(logn),最大公约数
进入考场,我们最好将下列头文件和主函数写到电脑的记事本里,这样的话,每写一个程序时直接复制粘贴即可,把时间省下来用于后面难题的调试!
//#include 同样是ctrl+c,为啥要搞万能头呢
#include
#include
#include
#include
#include
typedef long long LL;
const int N=1e5+10;
using namespace std;
int main()
{
return 0;
}
~
:1,2,4,8,16,32,64,128,256,512,1024
:32768
:65536
sort(a,a+12);
sort(a,a+12,greater
#include
#include
using namespace std;
int main()
{
int a[12]={12,32,234,45,65,9,0,11,2,3,-3,-21};
sort(a,a+12); //默认从小到大
for(int i=0;i<12;i++){
cout<() ); //从大到小
for(int i=0;i<12;i++){
cout<
-21 -3 0 2 3 9 11 12 32 45 65 234
234 65 45 32 12 11 9 3 2 0 -3 -21
c=max(a,b);
c=min(a,b);
//交换变量值
swap(a,b)
//绝对值
m=abs(m);
//查找
lower_bound(first,last,value);//查找有序数组第一个小于等于value的值
upper_bound(first,last,value);//查找有序数组第一个大于等于value的值
//引用 取别名就是小名
int a=10;
int &b=a;
//对b的操作也就是对a的操作,a,b代表同一个东西
//引用必须初始化,引用不能更改,只给一个变量用
//异或 ^
//下标从0开始
s.insert(pos,s2);//第pos个位置插入s2
s.erase(pos,num);//第pos个位置删除num个字符
s.substr(pos,num);//第pos个位置截取num个字符 ,父串不变
s1.find(s2,pos);//在s1中从pos个位置找s2
//s1.find(s2) 默认从0开始
字符串转整形:
typedef long long ll;
ll tra(string x) { //字符串转整
ll num=0;
ll n=1;
for (int i = x.length()-1; i >=0 ; i--) {
num += (x[i] - '0') * n;
n *= 10;
}
return num;
}
C 库函数 int atoi(const char *str) 把参数 str 所指向的字符串转换为一个整数(类型为 int 型)。
#include
#include
#include
int main()
{
int val;
char str[20];
strcpy(str, "98993489");
val = atoi(str);
printf("字符串值 = %s, 整型值 = %d\n", str, val);
strcpy(str, "runoob.com");
val = atoi(str);
printf("字符串值 = %s, 整型值 = %d\n", str, val);
return(0);
}
注意:只有字符储存在char类型字符数组里面时才可以用,string不可用!!!
整形转字符串:
itoa(i ,num ,10 );
i ---- 需要转换成字符串的数字
num ---- 转换后保存字符串的变量
10 ---- 转换数字的基数(即进制)。10就是说按10进制转换数字。还可以是2,8,16等等你喜欢的进制类型
返回值:指向num这个字符串的指针
#include
#include
int main(void)
{
int number = 12345;
char str[32];
itoa(number, string, 10);
printf("integer = %d string = %s\n", number, str);
return 0;
}
最大公约数:
int gcd(int a,int b) //欧几里得算法
{
return b?gcd(b,a%b):a;
}
while(m%n) //辗转相除法
{
int r=m%n;
m=n;
n=r;
}
cout<
int gcd(int a, int b) //递归
{
if(b==0)
{
return a;
}
else
{
return gcd(b,a%b);
}
}
最小公倍数:
a*b/最大公约数=最小公倍数