C语言解决渔夫打鱼晒网问题

如果一个渔夫从 2015 年 1 月 1 日开始每三天打一次渔,两天晒一次网,编程实现当输入 2015 1 月 1 日以后的任意一天,输出该渔夫是在打渔还是在晒网。

实现过程:

(1) 自定义函数 leap(),用来判断输入的年份是否是闰年。

(2) 自定义函数 number(),用来计算输入日期距 20152015201520152015 年 1 月 1 日共有多少天。

(3) main() 函数作为程序的入口函数,在 main() 函数中调用上面两个函数。程序代码如下:

#include <stdio.h>
int leap(int a) /*自定义函数leap()用来指定输入的年份是否为闰年*/
{
    if (a%4==0&&a%100!=0||a%400==0)    /* 闰年判定条件 */
        return 1;    /*是闰年返回1*/
    else
        return 0;    /*不是闰年返回O*/
}

int number(int year,int month,int day)    /*自定义函数 number() 计算输入日期距2011年1月1日共有多少天*/
{
    int sum = 0, i, j, k;
    int a[12]={31,28,31,30,31,30,31,31,30,31,30,31};    /*数组a存放平年每月的天数*/
    int b[12]={31,29,31,30,31,30,31,31,30,31,30,31};    /*数组b存放闰年每月的天数*/

    if(leap(year)==1)    /*判断是否为闰年*/
        for(i=0;i<month-1;i++)
        sum+=b[i];    /*是闰年,累加数组b前m-1个月份的天数*/
    els
  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
打鱼晒网问题是一个经典的计算机科学问题,通常用来介绍算法设计与分析的基本思想。简单来说,问题描述如下: 有一条河流,长度为n,河中有m条鱼。每条鱼在河流中的位置用一个整数表示,鱼的大小也用一个整数表示。每次可以在河流中选择一段区间,捕获其中所有的鱼,但只能捕获其中最大的那条。同时,在捕获鱼之前,需要先将区间中所有鱼晒干,晒干每条鱼需要1个时间单位。求最短需要多少时间才能将所有的鱼都捕获。 这个问题可以用贪心算法来解决。首先将所有鱼按照位置从左到右排序,然后依次捕获每条鱼。具体而言,从第一条鱼开始,依次向右扫描每一条鱼,对于每条鱼,计算它与前一条鱼的距离,然后累加上晒干和捕获这条鱼所需要的时间。如果当前的这条鱼比前一条鱼大,那么就需要等待,直到晒干它的时间结束。如果当前的这条鱼比前一条鱼小,那么就可以直接晒干和捕获这条鱼。最终,所有鱼都被捕获且时间最短。 下面是一个简单的C语言程序实现: ```c #include <stdio.h> #include <stdlib.h> #define MAXN 100000 struct Fish { int pos; int size; }; int cmp(const void *a, const void *b) { return (*(struct Fish *)b).size - (*(struct Fish *)a).size; } int main() { int n, m, i, j, k, t, time = 0; struct Fish fish[MAXN]; scanf("%d %d", &n, &m); for (i = 0; i < m; i++) { scanf("%d %d", &fish[i].pos, &fish[i].size); } qsort(fish, m, sizeof(struct Fish), cmp); for (i = 0; i < m; i++) { t = fish[i].pos - (i > 0 ? fish[i - 1].pos : 0); if (t > time) { time = t; } time += fish[i].size; } printf("%d\n", time); return 0; } ``` 这个程序读入河流长度n和鱼的数量m,然后依次读入每条鱼的位置和大小。将所有鱼按照大小从大到小排序,然后依次扫描每一条鱼,计算晒干和捕获的时间,并更新时间最短值。最终输出时间最短值即可。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值