【算法竞赛入门】【第一章】课后习题

今天心血来潮,决定将《算法竞赛入门经典》里面的课后题,进行详解,先来第一发。

习题1-1 平均数(average)

对于第一题,相信即便是第一次接触编程的人。只要稍稍了解一下C的语法,也可轻易解决这一题。所以我也不多说了直接上代码。

#include <stdio.h>

int main()
{
    int a, b, c;
    while(scanf("%d%d%d",&a,&b,&c)!=EOF){
        printf("%.3lf\n",(a+b+c)/3.0);
    }
    return 0;
}

习题1-2 温度(temperature)

题目连公式都给了,没什么好说的

#include <stdio.h>

int main()
{
    double f,c;
    while(scanf("%lf",&f)!=EOF){
        c = 5 * ( f - 32 ) / 9;
        printf("%.3lf\n",c);
    }
    return 0;
}

习题1-3 连续和(sum)

这一题的话,我相信肯定会有一部分人在学完循环之后代码会这样写

#include <stdio.h>

int main()
{
    int n,sum,i;
    while(scanf("%d",&n)!=EOF){
        sum = 0;
        for(i = 1; i <= n; i++ )
            sum += i;
        printf("%d\n",sum);
    }
    return 0;
}

或者是使用while之类的循环语句来做。但是我要说这样不行,当然不是它不对,而是在算法竞赛中除了答案之外,我们最重视的就是效率了,用循环需要执行至少n次。然而如果我们使用递增数列的求和公式的话,我们的效率将大大的提高,在算法竞赛中我们使用的是黑盒评测的模式,这种模式的特点就是只关心结果而不关心过程。所以我们的代码应该这样:

#include <stdio.h>

int main()
{
    int n;
    while(scanf("%d",&n)!=EOF){
        printf("%d\n",(n+1)*n/2);
    }
    return 0;
}

习题1-4 正弦和余弦(sin cos)

#include <stdio.h>
#include <math.h>
int main()
{
    double n;
    while(scanf("%lf",&n)!=EOF){
        printf("%lf,%lf\n",sin(n),cos(n));
    }
    return 0;
}

这一题中我们使用到了数学函数,其中大部分的数学函数均在 math.h 中。我还要说明一点在算法竞赛中我们只需要输出结果,并不需要多余的提示,不然你会发现你的答案会莫名的错了。然而这个应该就是算法竞赛和实际编程中的区别之一。

习题1-5 距离(distance)

#include <stdio.h>
#include <math.h>
int main()
{
    double x1,y1,x2,y2;
    while(scanf("%lf%lf%lf%lf",&x1,&y1,&x2,&y2)!=EOF){
        printf("%.3lf\n",sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2)));
    }
    return 0;
}

习题1-6 偶数(odd)

判断偶数的方法有很多,这里我就用我认为最简单的方法

#include <stdio.h>

int main()
{
    int a;
    while(scanf("%d",&a)!=EOF){
        printf("%s\n",a%2?"no":"yes");
    }
    return 0;
}

习题1-7 打折(discount)

#include <stdio.h>

int main()
{
    int n;
    double monkey;
    while(scanf("%d",&n)!=EOF){
        monkey = 95 * n;
        if( n > 3)
            monkey *= 0.85;
        printf("%.3lf\n",monkey);
    }
    return 0;
}

习题1-8绝对值(abs)

这一题有两种方法,一种使用库函数,一种不用。下面我使用不适用库函数的方法吧:

#include <stdio.h>

int main()
{
    double n;
    while(scanf("%lf",&n)!=EOF){
        printf("%.2lf\n",n>0?n:-n);
    }
    return 0;
}

习题1-9 三角形(triangle)

判断三条边是否可以构成三角形,我们可以使用任意两边和大于第三边的方式:

#include <stdio.h>

int main()
{
    int a,b,c;
    while(scanf("%d%d%d",&a,&b,&c)!=EOF){
        if( a+b>c && a+c>b && b+c>a )
            printf("yes\n");
        else
            printf("no\n");
    }
    return 0;
}

习题1-10 年份(year)

①、普通年能被4整除且不能被100整除的为闰年。

②、世纪年能被400整除的是闰年

③、对于数值很大的年份,这年如果能整除3200,并且能整除172800则是闰年。如172800年是闰年,86400年不是闰年(这一点我们通常可以不用考虑)

于是代码如下:

#include <stdio.h>

int main()
{
    int year;
    while(scanf("%d",&year)!=EOF){
        if(year%400==0)
            printf("yes\n");
        else if(year%4==0&&year%100!=0)
            printf("yes\n");
        else
            printf("no\n");
    }
    return 0;
}

其他章节我会慢慢补上,持续更新中。。。



时间: 2024-11-08 10:34:27

【算法竞赛入门】【第一章】课后习题的相关文章

[算法竞赛入门]第二章_循环结构程序设计

第2章 循环结构程序设计 [学习内容相关章节] 2.1for循环 2.2循环结构程序设计 2.3文件操作 2.4小结与习题 [学习目标] (1)掌握for循环的使用方法: (2)掌握while循环的使用方法: (3)学会使用计算器和累加器: (4)学会用输出中间结果的方法调试: (5)学会用计时函数测试程序效率: (6)学会用重定向的方式读写文件: (7)学会fopen的方式读写文件: (8)了解算法竞赛对文件读写方式和命名的严格性: (9)记住变量在赋值之前的值是不确定的: (10)学会使用条

第一章课后习题1.6

1.6 编写带有下列声明的例程: public void permute(String str); private void permute(char[] str, int low, int high); 第一个例程是个驱动程序,它调用第二个例程并显示String str中的字符的所有排列.例如,str是"abc", 那么输出的串则是abc,acb,bac,bca,cab,cba,第二个例程使用递归. package com.algorithm.chapterone; /** * 编写

算法竞赛入门经典_1.5_习题练习

1.温度问题 #include <stdio.h> int main() { double f, c; scanf("%lf", &f); c = 5*(f - 32)/9.0; printf("%.3lf\n", c); return 0; } 运行结果: 2.平均数问题 #include<stdio.h> int main() { int a, b, c; scanf("%d%d%d", &a, &am

谭浩强 c++程序设计第一章课后习题 第7题

#include <iostream> using namespace std; int main() { int a,b,c; int f(int x,int y,int z);//这是函数的声明 //cin sonsole控制台 cout<<"请输入三个整数类型的数字:" <<endl; cin>>a>>b>>c; c=f(a,b,c);//abc有具体值,称为实际参数 cout<<c<<

谭浩强 c++程序设计第一章课后习题 第10题

#include <iostream> using namespace std; int main() { int a,b,c; cout<<"请输入三个整数类型的数字:" <<endl; cin>>a>>b>>c; void sort(int x,int y,int z); sort(a,b,c);//abc有具体值,称为实际参数 return 0; } void sort(int x,int y,int z)/

第一章课后习题

1-1:数据压缩的一个基本问题是“我们要压缩什么”,对此你是怎么理解的? 答:数据压缩,就是指不丢失有用信息的前提下,以最少的数码表示信号源所发的信号,减少容纳给定消息集合或数据采样集合的信号空间. 1-2:数据压缩的另一个基本问题是“为什么进行压缩”,对此你是怎么理解的? 答:因为多媒体技术所处理的对象包括图像.视频和声音等多种媒体.它们的数据量非常大. 如果不进行数据压缩传输和存储都难以实用化.而经过数据压缩可以将一些占用内存比较 大多媒体数据,压缩成可以缩小的文件内存,这样可以方便传递,节

刘汝佳算法竞赛入门经典 第二单元习题答案自编

欢迎交流讨论! @2-1 #include <fstream> using namespace std; ifstream fin("aplusb.in"); ofstream fout("aplusb.out"); int main(){ int n; while(fin>>n){ int count = 0; //计算位数 while(n){ count++; n /= 10; } fout << count <<

第一章 课后习题 10

1 #include <iostream> 2 using namespace std; 3 int main() 4 { void sort(int x,int y,int z); 5 int x,y,z; 6 cin>>x>>y>>z; 7 sort(x,y,z); 8 return 0; 9 } 10 void sort(int x,int y,int z) 11 { 12 int temp; 13 if(x>y) {temp=x;x=y;y=t

第一章 课后习题 7

1 #include<iostream> 2 using namespace std; 3 int main() 4 { 5 int a,b,c; 6 int f(int x,int y,int z); 7 cin>>a>>b>>c; 8 c=f(a,b,c); 9 cout<<c<<endl; 10 return 0; 11 } 12 int f(int x,int y,int z) 13 { 14 int m; 15 if(x&l

第一章课后习题1.5

1.5 编写一种递归方法,它返回数N的二进制中表示1的个数.利用这样一个事实:N为奇数,其1的个数为N/2的二进制中1的个数加1. package com.algorithm.chapterone; /** * 编写一种递归方法,它返回数N的二进制中表示1的个数.利用这样一个事实:N为奇数,其1的个数为N/2的二进制中1的个数加1. * @author Gao·Rongzheng * */ public class QuestionFour { public static void main(S