码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2015-04-08 15:10:41      阅读:154      评论:0      收藏:0      [点我收藏+]

标签:

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

习题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;
}
其他章节我会慢慢补上,持续更新中。。。



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

标签:

原文地址:http://blog.csdn.net/luomingjun12315/article/details/44939105

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!