zoukankan      html  css  js  c++  java
  • 《算法竞赛入门经典》第1章 程序设计入门

    提示1-1:整数值用%d输出,实数用%lf输出。

    提示1-2:整数/整数=整数,浮点数/浮点数=浮点数。

    提示1-3:scanf中的占位符和变量的数据类型应一一对应,且每个变量前需要加&(取地址)符号。

    提示1-4:在算法竞赛中,输入前不要打印提示信息。输出完毕后应立即终止程序,不要等待用户按键,因为输入输出过程都是自动的,没有人工干预。

    提示1-5:在算法竞赛中不要使用头文件conio.h,包括getch()、clrscr()等函数。

    提示1-6:在算法竞赛中,每行输出均应以回车符结束,包括最后一行。除非特别说明,每行的行首不应有空格,但行末通常可以有多余空格。另外,输出的每两个数或者字符串之间应以单个空格隔开。

    提示1-7:尽量用const关键字声明常数。

    1 const double pi = 4.0 * atan(1.0);

    这里声明了一个叫pi的符号,但是const关键字表明它的值是不可以被改变的——pi是一个真正的数学常数。有的读者可能会用math.h中定义的常量M_PI,但其实这个常数不是ANSI C标准的,不信的话可以用"gcc -ansi"编译试试。

    提示1-8:赋值是个动作,先计算右边的值,在赋给左边的变量,覆盖它原来的值。

    提示1-9:printf的格式字符串中可以包含其他可打印字符,打印时原样输出。

    例题1-2 三位数反转

    输入一个三位数,分离出它的百位、十位和各位,反转后输出。

    样例输入:127

    样例输出:721

    1 #include <stdio.h>
    2 
    3 int main()
    4 {
    5     int n;
    6     scanf("%d", &n);
    7     printf("%d%d%d
    ", n%10, n/10%10, n/100);
    8     return 0;
    9 }

    运行结果如下:

    说明:运算符*、/、%的优先级相同(优先级4),为左结合性,即从左往右运算。

    上面的程序输出027,但要改成输出27似乎会比较麻烦——我们必须判断n&10是不是0。一个解决方法是把结果储存到变量m当中,这样,直接用%d格式输出m,将输出27。如果要输出027也很容易,把输出格式变为%03d即可。

     1 #include <stdio.h>
     2 
     3 int main()
     4 {
     5     int n, m;
     6 
     7     scanf("%d", &n);
     8     m = (n % 10) * 100 + (n / 10 % 10) * 10 + n / 100;
     9     printf("%03d
    ", m);
    10     return 0;
    11 }

    运行结果如下:

    提示1-10:算法竞赛的题目应当是严密的,各种情况下的输入均应有严格规定。如果在比赛中发现题目有漏洞,应向相关人员询问,而尽量不要自己随意假定。

    例题1-3 交换变量

    输入两个整数a和b,交换二者的值,然后输出。

    样例输入:824 16

    样例输出:16 824

     1 /* 三变量法 */
     2 #include <stdio.h>
     3 
     4 int main()
     5 {
     6     int a, b, t;
     7 
     8     scanf("%d%d", &a, &b);
     9     t = a;
    10     a = b;
    11     b = t;
    12     printf("%d %d
    ", a, b);
    13 
    14     return 0;
    15 }

    也可以不使用中间变量

     1 /* 两变量法 */
     2 #include <stdio.h>
     3 
     4 int main()
     5 {
     6     int a, b, t;
     7 
     8     scanf("%d%d", &a, &b);
     9     a = a + b;
    10     b = a - b;
    11     a = a - b;
    12     printf("%d %d
    ", a, b);
    13 
    14     return 0;
    15 }

    最合适的程序莫过于

     1 #include <stdio.h>
     2 
     3 int main()
     4 {
     5     int a, b, t;
     6 
     7     scanf("%d%d", &a, &b);
     8     printf("%d %d
    ", b, a);
     9 
    10     return 0;
    11 }

    换句话说,我们的目标是解决问题,而不是为了写程序而写程序,同时应保持简单(Keep It Simple and Stupid,KISS),而不是自己创造条件去展示编程技巧。

    提示1-13:算法竞赛是在比谁能更好地解决问题,而不是在比谁写的程序看上去更高级。

    例题1-4 鸡兔同笼

    已知鸡和兔的总数量为n,总腿数为m。输入n和m,依次输出鸡的数目和兔的数目。如果无解,则输出“No answer”。

     1 #include <stdio.h>
     2 
     3 int main()
     4 {
     5     int a, b, n, m;
     6 
     7     scanf("%d%d", &n, &m);
     8     a = (4*n -m) / 2;
     9     b = n - a;
    10     if (m % 2 == 1 || a < 0 || b < 0)
    11     {
    12         printf("No answer
    ");
    13     }
    14     else
    15     {
    16         printf("%d %d
    ", a, b);
    17     }
    18 
    19     return 0;
    20 }

    运行结果如下:

  • 相关阅读:
    CodeForces 7B
    CodeForces 4D
    离散化
    线段树入门
    洛谷 P3951 小凯的疑惑(赛瓦维斯特定理)
    Codeforces 1295D Same GCDs (欧拉函数)
    Codeforces 1295C Obtain The String (二分)
    Codeforces 1295B Infinite Prefixes
    Codeforces 1295A Display The Number(思维)
    Codeforces 1294F Three Paths on a Tree(树的直径,思维)
  • 原文地址:https://www.cnblogs.com/rezone/p/3201659.html
Copyright © 2011-2022 走看看