算法竞赛入门经典语言篇笔记

1.整数 - 浮点数 = 浮点数,确切的说法是整数先“变”成浮点数,然后浮点数 - 浮点数 = 浮点数。

2.acos()函数返回一个以弧度表示的反余弦值,acos(0.540302) is 1.000000
acos(-1.000000) is 3.141593

4.int型整数的最小值和最大值是多少(需要精确值)?
INT_MAX = 2147483647,INT_MIN = -2147483678

5.在< cfloat >头文件下
DBL_MAX = 1.79769e + 308
DBL_MIN = 2.22507e - 308

7.如何判断n是否为完全平方数?可以先求出其平方根,然后看它是否为整数,即用一个int型变量m存储sqrt(n)四舍五入后的整数,然后判断m^2是否等于n,函数floor(x)返回不超过x的最大整数。即int m = floor(sqrt(n) +0.5) if(m * m == n)即可。。
也可以写成if(sqrt(n) == floor(sqrt(n))),输出。即可判断sqrt(n)是否为整数,理论上没问题不过不保险,因为浮点数的运算和函数有可能存在误差。
假设在经过大量计算之后,由于误差的影响,整数1变成了0.9999999999999,floar的结果会是0而不是1,为了减小误差的影响,一般搞成四舍五入,对x进行四舍五入,floor(x + 0.5)

8.几乎所有算法竞赛的输入数据和标准答案都是保存在文件中的。
freopen(“input.txt”,“r”,stdin);
freopen(“output.txt”,“w”,stdout);

9.memset(a,0,sizeof(a));把数组a清零

10.a[j] = !a[i]比! 使用乘+1,-1好用。

11.⚠️在很多情况下,最好是在做一件事之前检查是不是可以做,而不要做完再后悔。因为“悔棋”往往比较麻烦。

12.%5d,它按照5位数打印,不足5位在前面补空格。

13.printf输出到屏幕,fprintf输出到文件,sprintf输出到字符串。
例如abc = 775,de = 33,x = 2325,y = 2325,z = 25575。
sprintf(buf,"%d%d%d%d%d",abc,de,x,y,z);
则buf = “775332325232515575”。
if(strchr(s,buf[i]) == NULL) 在一个字符串中查找单个字符,找buf[i]在字符串的位置,找到之后,返回该字符+之后的字符,没找到返回NULL,strchr(2357,3)会返回357.

14.scanf输入字符串可以,但是碰到空格或者是tab键就会停下,可以用两种方法解决这个问题。
第一种是使用"fgetc(fin)" 它读取一个打开的文件fin,读取一个字符然后返回一个int值,为什么返回的是int而不是char呢?,因为如果文件结束,fgetc将返回一个特殊标记EOF,它并不是一个char,如果把fgetc(fin)的返回值强制转换为char,将无法把特殊的EOF和普通字符区分开。如果要从标准输入读取一个字符,可以用getchar,它等价于fgetc(stdin)
提示,使用fgetc(fin)可以从打开的文件fin中读取一个字符,一般情况下应当在检查它不是EOF后再将其转换成char值。从标准输入读取的第一个字符可以用getchar,它等价于fgetc(stdin)。
⚠️不同操作系统的回车换行符是不一致的。
在使用fgetc和getchar时,应该避免写出和操作系统相关的程序。
第二个方法是使用“fget(buf,maxn,fin)”读取完整的一行。

15.字典序:就是字符串在字典中的顺序。一般的,对于两个字符串,从第一个字符开始比较,当某一个位置的字符不同时,该位置字符较小的数,字典序较小;如果其中一个字符串已经没有更多的字符,但另一个字符串还没结束,则较短的字符串的字典序较小。字典序的概念可以推广的到任意序列。

16.函数hypot(x,y)计算直角三角形的斜边长。
⚠️即使最终答案在所选择的数据类型范围之内,计算的中间结果仍然可能溢出。

17.调用栈描述的是函数之间的调用关系。它由多个栈帧组成,每个栈帧对应着一个为运行完的函数。栈帧中保存了该函数的返回地址和局部变量,因而不仅能在执行完毕之后找到正确的返回地址,还很自然地保证了不同函数间的局部变量互不相干—因为不同函数对应着不同的栈帧。

18.C语言的sodlib.h中有一个叫qsort的库函数,实现了著名的快速排序算法。它的声明是
void qsort(void * base,size_t num,size_t size,int(* comparator) (const void *,const void * ));
前三个参数分别是待排序的数组起始地址、元素个数和每个元素的大小。最后一个参数比较特别,是一个指向函数的指针,该函数应当具有这样的形式:
int cmp(const void * ,const void *) {~~~}
指向常数的“万能”的指针:const void * ,它可以通过强制类型转化变成任意类型的指针。不过不常用,因为有c++里面的sort啦。

19.C++能编译大多数C语言程序,虽然C语言中大多数头文件在C++中仍然可以使用,但推荐的方法是在C头文件之前加一个小写的c字母,然后去掉.h后缀。

20.iostream提供了输入输出流,而algorithm提供了常用算法,例如min。

21.声明数组时,数组大小可以使用const声明的常数。

22.在C++里面,多一个数据类型,bool布尔值,然后用true和false分别代表真和假。

23.如果在参数名之前加一个“&”符号,就表示这个参数按照传引用的方式传递,而不是C语言里的传值方式传递。这样在函数内改变参数的值,也会修改到函数的实参。C++的引用就是变量的别名,它可以在一定程度上代替C中的指针,传引用的方式让函数内直接修改实参。

24.不能在函数中定义一个数组然后返回它的地址,因为函数返回后其中局部变量的地址便失效了。例如“字符串拼接”函数必须申请新的内存空间以存放结果,用完之后还要将申请的空间“退回去”,这样会很麻烦。
C++的cin/cout可以直接读写string类型,却不能读写字符数组;string类型还可以像整数那样“相加”,而在C语言里只能使用strcat函数。
例题:如何编写一个函数,把两个字符串拼接成一个长字符串。

25.例题:输入数据的每行包括若干个(至少一个)以空格隔开的整数,输出每行中的所有整数之和。如果只能使用字符与字符数组,一般有两种方案:一是使用getchar()边读边算,代码较短但是容易写错,并且相对较难理解。而是每次读取一行,然后再扫描该行的字符,同时计算结果。

#include<iostream>
#include<string>
#include<sstream>
using namespace std;

int main()
{
	string line;
	while(getline(fin,line))//读取一行数据
	{
		int sum = 0,x;
		stringstream ss(line);//字符串流
		while(ss >> x) sum += x;
		cout << sum << "\n";
	}
	return 0;
}

26.C++不再需要用typedef的方式定义一个struct,而且在struct里除了可以有变量(称为成员变量),之外还可以有函数(称为成员函数),在工程中,一般用struct定义纯数据类型,只包含较少的辅助成员函数。C++中的结构体除了可以拥有成员变量(a.x)还可以拥有成员函数(a.add)。

27.template< typename T>

28.STL是指C++的标准模版库

29.sort可以对任意对象进行排序,因为sort是一个模版函数。
排序对象可以保存在普通数组中,用sort(a,a + n)的方式调用。
排序对象也可以保存在vector中,用sort(v.begin(),v.end())的方式调用。

30.lower_bound的作用是查找“大于或者是等于x的第一个位置”
lower_bound(a,a+n,x);//在数组a中寻找x。

31.unique函数可以删除有序数组中的重复元素。

32.不定长数组:vector
vector就是一个不定长数组,可以用a.size()读取它的大小,a.resize()改变大小,a.push_back()向尾部添加元素,a.pop_back()删除最后一个元素,a.empty()测试是否为空。
声明:
const int maxn = 30;
vector< int> pile[maxn];//每个pile[i]是一个vector,类似于int a[]的整数数组。
vector就像一个二维数组,只是第一维的大小是固定的(不超过maxn),但第二维的大小不固定.

33.集合:set集合与映射也是两个常用的容器,set就是数学上的集合,每个元素最多只出现一次,和sort一样,自定义类型也可以构造set,但同样必须定义“小于”运算符。
isalpha(s[i])用来判断一个字符是否为英文字母
tolower(s[i]) 将字符转换为小写字母,非字母字符不做处理。
声明:

set< string> dict ;
dict.insert(buf)//向容器中插入数据
for(set<string>::iterator it = dict.begin();it != dict.end();++it)
//iterator是迭代器,用法类似于指针。
copt << *it << endl;

insert向容器中插入数据,set容器是有序的,因此向容器中插入数据时,set容器会依据“<”操作符进行排序。

34.映射:map数组高级版,因为重载了运算符[],关联数组,例如可以用一个map< string,int>month_name来表示“月份名字到月份编号”的映射,然后用month_name[“July”] = 7这样的方式来赋值。
map和set两种容器的底层结构都是红黑树,所以容器中不会存在相同的元素,因此count()的结果只能是0或1,可以以此来判断键值元素是否存在。
set头文件中的set和map头文件中的map分别是集合和映射。

35.cctype头文件中拥有许多字符串处理函数,检查大小写,空格,转换大小写等。
algorithm头文件中有sort(),stable.sort(),nth_element()等。

36.栈、队列和优先队列
【1】所谓栈就是后进先出规则的数据结构,有PUSH和POP两种操作,其中PUSH把元素压入“栈顶”,而POP从栈顶把元素“弹出”。
STL的栈定义在头文件< stack>中,可以用“stack< int>s”方式声明一个栈.用push()和pop()实现元素的入栈和出栈操作,top()取栈顶元素(但不删除)。
【2】STL队列在quene头文件< quene>中,可以用queen< int>s 方式声明一个队列。
STL的quene头文件提供了队列,用push()和pop()进行元素的入队和出队操作,front()取队首元素(但不删除)。
【3】STL的优先队列也定义在头文件 < quene>里,用“priority_quene< int> pq”来声明。这个pq是一个“越小的整数优先级越低的优先队列”由于出队元素并不是最先进队的元素,出队的方法由quene的front()变成了top()。
对于一些常见的优先队列,STL提供了更为简单的定义方法,例如“越小的整数优先级越大的优先队列”可以写成"priority_quene<int,vector< int>,greater< int> >pq"
注意最后两个">“符号不要写在一起,否则会被很多编译器误认为是”>>"运算符。
STL的quene头文件提供了优先队列,用“priority_quene< int> pq”来定义,用push()和pop()进行元素的入队和出队操作,top()取队首元素(但不删除)。

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Αиcíеиτеǎг

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

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

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

打赏作者

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

抵扣说明:

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

余额充值