book_acm

做题技巧

浮点数eps

判断两个浮点数误差的时候,使用fabs(a-b) < eps,一般的eps为1e-9。如果有可能,尽量避免浮点运算,做整数的转换。

计算一元二次方程解的时候,可以进行如此运算,例如((sqrt(8.0*n+1)-1)/2-eps)+1

熟用log函数

多多利用log函数,用以减小数量级。

利用矩阵

矩阵的乘积

有向面积

通过有向面积判断点是否在图形内部

通过行列式的三个点求有向面积

例如:

     | x0 y0 1 |
2A = | x1 y1 1 | = x0y1 + x2y0 + x1y2 - x2y1 - x0y2 - x1y0
     | x2 y2 1 |

两倍的三角形面积 方法是构建齐次坐标,如果逆时针,有向面积为正,逆时针,有向面积为负。

类型范围

类型 范围
unsigned int 0~4294967295
int 2147483648~2147483647
unsigned long 0~4294967295
long 2147483648~2147483647
long long的最大值: 9223372036854775807
long long的最小值: -9223372036854775808
unsigned long long的最大值: 18446744073709551615
__int64的最大值: 9223372036854775807
__int64的最小值: -9223372036854775808
unsigned __int64的最大值: 18446744073709551615

生成测试数据

比赛的时候出现了100 * 100组数据的情况,但是当时使用freopen忘记了具体的步骤, 特意重新写一下,也是属于基础的内容。

生成一百行数据,每行100个数据,每个数据为100。

#include <stdio.h>
#include <iostream>`enter code here`
using namespace std;

int main()
{
    freopen("input", "r", stdin);
    freopen("output", "w", stdout);

    for(int i = 0; i < 100; i++)
        for(int j = 0; j < 100; j++)
            printf("%d%c", 100, j == 99? '\n' : ' ');

    fclose(stdin);
    fclose(stdout);
    return 0;
}

运行过后生成的数据(本来应该输出在屏幕上,此时不会输出到屏幕,而是输出到文件)会保存到output文件中。 如果需要使用直接更改output的文件名,再使用一次freopen('r')即可。