卡常数

Posted yufenglin

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了卡常数相关的知识,希望对你有一定的参考价值。

作为第一篇非题解博客,确实有一点激动。。。

1.什么是卡常数?

百度上的定义:
程序被卡常数,一般指程序虽然渐进复杂度可以接受,但是由于实现/算法本身的时间常数因子较大,使得无法在OI等算法竞赛规定的时限内运行结束。
2.如何解决卡常数?
1.改进算法本身(这应该是一句废话)
2.register-这个我也不是特别了解,据说是寄存CPU中,从而使得读取更快,由于CPU较小,所以实际的意义不大,但是如果是频繁调用(例如循环),最好还是带上。。。
3.快速读入和快速输出
  (1)快读
    首先先讲一件显然的事情:输入速度getchar>scanf>cin,那么我们就想能不能利用getchar来进行读入呢?
    先上代码(可以读取整数):(格式并不规范,理解就好。。。)
 1 inline int read()
 2 {
 3     int x=0,w=1;
 4     char ch;
 5     while(ch<0||ch>9)
 6     {
 7         if(ch==-)
 8             w=-1;
 9         ch=getchar();
10     }
11     while(ch>=0&&ch<=9)
12         x=(x<<3)+(x<<1)+ch-0,ch=getchar();
13     return x*w;
14 }
15 int a;
16 a=read();

在这里x用于记录大小(可以近似地认为是绝对值),而w用于记录正负,第一个while循环用于排除空格等无关字符的干扰,第二个用于记录数的大小(原理也比较简单:每遇到一个新的位数就把之前的x乘以10,再加上这个位数上的数)最后return即可。。。

  (2)快输(有点不吉利。。。)

    同理,关于putchar等输出方法的快慢大家应该已经了解了吧。。。

    还是先上代码:

1 inline void write(int x)
2 {
3     if (x < 0) putchar(-), x = -x;
4     if (x > 9) write(x / 10);
5     putchar(x % 10 + 0);
6 }
7 write(a);

这个应该比较好理解吧,简单的递归。。。

 

总结一下,时间复杂度的核心还是算法本身,这些毕竟只是锦上添花,最重要的还是设计出优秀的算法!

以上是关于卡常数的主要内容,如果未能解决你的问题,请参考以下文章

卡常数

从父片段到选项卡片段的接口侦听器不起作用

卡常数大法好!

显示 ActionBar 选项卡的两个片段

Android - 一个选项卡中的多个片段

在具有多行标题的选项卡上设置片段