美文网首页
算法竞赛入门1-2章

算法竞赛入门1-2章

作者: 乘瓠散人 | 来源:发表于2018-01-17 15:26 被阅读36次

    非学无以广才,非志无以成学

    1-1 整数值用%d输出,实数用%f输出
    1-2 scanf中的占位符和变量的数据类型一一对应,且每个变量前需要加&符号
    1-3 尽量用const关键字声明常数,const double pi = acos(-1.0);
    1-4 C99标准中double的输入采用%lf,输出必须采用%f
    1-5 算法竞赛是在比谁能更好地解决问题,而不是在比谁写的程序看上去更高级
    1-6 int型整数和double型浮点数的最大最小值

    #include <iostream>
    #include <limits.h>
    #include <float.h>
    using namespace std;
    
    int main()
    {
        cout<<"最大int型整数"<<INT_MAX<<endl;
        cout<<"最小int型整数"<<INT_MIN<<endl;
    
        cout<<"最大double型实数"<<DBL_MAX<<endl;
        cout<<"最小double型实数"<<DBL_MIN<<endl;
    
        return 0;
    }
    
    image.png

    2-1 建议尽量缩短变量的定义范围。例如在for循环的初始化部分定义循环变量
    2-2 在目前流行的竞赛平台上,int都是32位整数,范围为-2^31 ~ 2^31-1
    2-3 乘法时整数溢出,则使用long long , 范围为-2^63 ~ 2^63-1
    2-4 long long 在Linux下的输入输出格式符为%lld,但在Windows平台中有时为%I64d.为保险起见,可以用C++流,或者编写自定义输入输出函数。
    2-5 使用计时函数返回程序目前为止运行的时间。引入<time.h>头文件,输出为printf("Time used = %.2f\n", (double)clock() / CLOCKS_PER_SEC);
    2-6 scanf函数返回的是成功输入的变量个数
    2-7 输入输出数据保存在文件中

    • 使用重定向方式
    #define LOCAL
    #include<stdio.h>
    int main()
    {
    #ifdef LOCAL
    freopen("data.in", "r", stdin);
    freopen("data.out", "w", stdout);
    #endif 
      int x, s = 0, n = 0;
      while(scanf("%d", &x) == 1)
      {
        s+=x;
        n++;
      }
    printf("%.3f\n",(double)s/n); 
    return 0;
    }
    

    如果比赛要求使用标准输入输出,只需在提交之前删除#define LOCAL即可。

    • 如果比赛要求用文件输入输出,但禁止使用重定向方式,应使用fopen和fscanf/fprintf进行输入输出。
    #include<stdio.h>
    int main()
    {
      FILE *fin, *fout;
      fin = fopen("data.in", "rb");
      fout = fopen("data.out", "wb");
      int x, s = 0, n = 0;
      while(fscanf(fin, "%d",  &x) == 1)
      {
        s+=x;
        n++;
      }
      fprintf(fout, "%.3f\n", (double)s/n); 
      fclose(fin);
      fclose(fout);
      return 0;
    }
    

    如果想把它改成标准输入输出,只需赋值fin = stdin; fout = stdout;即可,不用调用fopen和fclose.

    2-8 在输入为多组数据的题目中,一个常见的错误就是:在计算完一组数据后某些变量没有重置,影响到下组数据的求解。
    2-9 要计算只包含加法,减法和乘法的整数表达式除以正整数n的余数,可以在每步计算之后对n取余,结果不变。
    2-10 输出保留到小数点后c位printf("%.*f\n", c, s*1.0/n);

    相关文章

      网友评论

          本文标题:算法竞赛入门1-2章

          本文链接:https://www.haomeiwen.com/subject/ceneoxtx.html