细节处理

2018.1.25

1. C++的转化类型:
  • 例如我们想把两个多项式a,b,进行(a)/(b)操作

  • 因为方便,我们想直接把两个多项式转为double或long double,此时必须写成:

(long double)(A)/(B)

千万不能写成

(long double)(A/B)

2018.4.6

2.宏定义MAX,MIN:
  • 因为常数,大多数人有宏定义\(max,min\)的习惯.

  • 但这时应当注意,如果我们需要比较的是一个函数值,或者一个需要大量计算得到的结果,这时,有两种方法:

    • 一,用一个变量存起来.

    • 二,不要宏定义

  • 往往第一种方法会使代码量增加,且不美观,所以此时,第二种方法比较受欢迎.

  • 一定要注意不要重复计算...常数巨大!


2018.4.16

3.数组参数:
  • 比方说我想带一个数组到过程里,我们知道,有一种特殊的C++式的方法:
int a[100];

void mine(int *a) {
    ...
}

int main() {

    mine(a);
}
  • 我们用一个\(*\),类似指针的意思,但是实现里面还是与数组一模一样.

  • 值得一提的是,对于C++而言,\(*\)式数组仅仅支持\(1\)维,对于二维及跟高维度的数组,我们必须采用结构体!

  • 像这样:


sturct node {
    int array[100][100];
} t;

void add(node x, node y) {
    x.array[1][1] = y.array[1][1];
    memset(x.array, 0, sizeof a.array);
    ...
}

int main() {
    
    add(t);
}
  • 当然,如果我们在过程里面,不需要所谓的二维..

  • 那我们还可以这样做:


int a[100][100];

void reduce(int *a) {
    a[1] = 1;
    a[2] = 2;
}

int main () {
    
    reduce(a[1]);
    reduce(a[2]);
    
    printf("%d %d",a[1][1],a[2][2]);
}
  • 输出结果是\(1\ 2\)

2018.4.21

4. 对拍
  • 有些题,真的不管你怎么对拍,会发现都拍不出错,所以,对拍并不是万能的.

  • 这时,一定要仔细思考自己的程序是否会有漏洞,脑+眼+手解决..


2018.6.7

5. longlong取模

【COCI2007】追捕盗贼做这题的时候我用了双Hash,我是这样打的:

#define T1(x, y) (long long) (x * Mo1 + y * Mo2) % Mo3
#define T2(x, y) (long long) (x * Mo4 + y * Mo5) % Mo6

const int Mo1 = 135123, Mo2 = 122321, Mo3 = 1235335,
          Mo4 = 121231, Mo5 = 723233, Mo6 = 3323123;
  • 然后死活WA.

  • 最后发现是爆longlong,改成这样就好了:

#define T1(x, y) (x * Mo1 + y * Mo2) % Mo3
#define T2(x, y) (x * Mo4 + y * Mo5) % Mo6

const long long Mo1 = 135123, Mo2 = 122321, Mo3 = 1235335,
          Mo4 = 121231, Mo5 = 723233, Mo6 = 3323123;
  • 我只想说,还不太熟的东西最好别用,其实就几个常数,开longlong也没关系,不要冒险.

猜你喜欢

转载自www.cnblogs.com/Pro-king/p/9268817.html