HDOJ2000-2050学习笔记

来源:互联网 发布:java invoke 方法 编辑:程序博客网 时间:2024/06/05 20:43

1.贪心算法

http://blog.csdn.net/pengwill97/article/details/53290090
-定义结构体
-c++内部的sort函数,节省写排序函数的时间
http://www.cnblogs.com/joyclub/p/4474663.html
-比较上一个节目结束时间和下一个节目的开始时间,不断的j=i。

2.各种数据类型的取值范围

http://blog.csdn.net/mafuli007/article/details/7325510
在后几个题里,经常要用到long long,来防止数据溢出。

3.求n边形面积

http://blog.csdn.net/hemmingway/article/details/7814494
http://www.w2bc.com/Article/9083
这里写图片描述

struct Point2d{    double x;    double y;    Point2d(double xx, double yy): x(xx), y(yy){}}; //计算任意多边形的面积,顶点按照顺时针或者逆时针方向排列double ComputePolygonArea(const vector<Point2d> &points){    int point_num = points.size();    if(point_num < 3)return 0.0;    double s = 0;    for(int i = 0; i < point_num; ++i)        s += points[i].x * points[(i+1)%point_num].y - points[i].y * points[(i+1)%point_num].x;    return fabs(s/2.0);}

i+1不在num里面,对i+1%num,循环到从头开始。

5.判断一个字符为汉字

汉字机内码在计算机的表达方式的描述是,使用二个字节,每个字节最高位一位为1.
计算机中,补码第一位是符号位,1 表示为负数,所以 汉字机内码的每个字节表示的十进制数都是负数  
注意:
汉字是两个阿斯克码小于零的字符组成,所以在统计结果的时候就要将count除以2了.
直接进行字母比较就可以比较阿斯克码

6.signed long类型的与unsigned long类型的有什么区别

http://blog.163.com/zz_forward/blog/static/2128982222012999150534/
signed long能表示[-2^31, 2^31-1]之间的整数
unsigned long能表示[0, 2^32-1]之间的整数

7.最小公倍数最大公约数

http://blog.csdn.net/iwm_next/article/details/7450424

8.pow()

加入头文件 math.h
pow(x,y) 计算x的y次方。 x、y及函数值都是double型,整形数也可以使用,会有强制类型转换的warning。

9.单精度浮点数(float)与双精度浮点数(double)

当输出单精度浮点型float变量f时,可以用
printf(“%.2f”,f);
来使输出结果保留两位有效数字。其中.2就是代表保留两位,如果要保留三位就是%.3f。用%.0f就是只输出整数。
如果是双精度浮点数double,就需要用%.2lf来使输出结果保留2位小数。

单精度浮点数(float)与双精度浮点数(double)的区别如下:

(1)在内存中占有的字节数不同
单精度浮点数在机内占4个字节
双精度浮点数在机内占8个字节
(2)有效数字位数不同
单精度浮点数有效数字8位
双精度浮点数有效数字16位
(3)所能表示数的范围不同
单精度浮点的表示范围:-3.40E+38 ~ +3.40E+38
双精度浮点的表示范围:-1.79E+308 ~ +1.79E+308
(4)在程序中处理速度不同
一般来说,CPU处理单精度浮点数的速度比处理双精度浮点数快

float,单精度浮点型,对应%f.
double,双精度浮点型,对应%lf.
在用于输出时:
float类型可以使用%lf格式,但不会有任何好处。
double类型如果使用了%f格式可能会导致输出错误。
在用于输入时:
double 类型使用了%f格式,会导致输入值错误。
float类型使用double类型不仅会导致输入错误,还可能引起程序崩溃。

10.gets scanf 取字符串

gets,scanf都会在末尾加上\0的,
他们的不同在于,scanf碰到缓冲区里面的空字符(空格,tab,回车,换行就会截断并添加\0),而gets是要等回车才截断字符串并添加\0的,而换行符删除
Int a[50] gets(a)
数组a里面没有换行符了,最后为’\0’
比如用输入字符串:abcdefg hijk回车
用scanf的话,会得到abcdefg,而gets则是:abcdefg hijk

Scanf读取字符串
http://blog.csdn.net/u013213837/article/details/45644297
http://blog.csdn.net/cover_sun/article/details/52842727

strlen()用来计算指定的字符串s 的长度,不包括结束字符”\0”。

11.fgets()

char * fgets(char * string, int size, FILE * stream);
参数说明:
• string为一个字符数组,用来保存读取到的字符。
• size为要读取的字符的个数。如果该行字符数大于size-1,则读到 size-1 个字符时结束,并在最后补充’ \0’;如果该行字符数小于等于 size-1,则读取所有字符,并在最后补充 ‘\0’。即,每次最多读取 size-1 个字符。

注意:
fgets()与gets()不一样,不仅仅是因为gets()函数只有一个参数 FILE *stream,更重要的是,fgets()可以指定最大读取的字符串的个数,杜绝了gets()使用不当造成缓存溢出的问题。
函数说明:
fgets()用来从参数stream 所指的文件内读入字符并存到参数s 所指的内存空间, 直到出现换行字符、读到文件尾或是已读了size-1 个字符为止, 最后会加上NULL 作为字符串结束.

返回值:gets()若成功则返回s 指针, 返回NULL 则表示有错误发生.

范例

include <stdio.h>main(){    char s[80];    fputs(fgets(s, 80, stdin), stdout);}执行this is a test //输入this is a test //输出
0 0
原创粉丝点击