大白菜豆腐 2022-11-15 19:51 采纳率: 100%
浏览 51
已结题

种树问题请用c语言来解决

img

img


这个是问题,该如何用c语言来做,不要用c++,因为我还没学数据结构与算法,所以贪心算法请用数组来做

  • 写回答

3条回答 默认 最新

  • 关注

    代码如下:

    #include <stdio.h>
    #include <stdlib.h>
    
    int main()
    {
        int n,h,i,j;
        int*p,*b,*e,*t;
        int index,flag,cnt;
        scanf("%d",&n);
        scanf("%d",&h);
        p =(int*)malloc(sizeof(int)*(n+1));
        b =(int*)malloc(sizeof(int)*h);
        e =(int*)malloc(sizeof(int)*h);
        t =(int*)malloc(sizeof(int)*h);
        for(i=0;i<=n;i++)
            p[i] = 0;
        for(i=0;i<h;i++)
        {
            scanf("%d %d %d",&b[i],&e[i],&t[i]);
            for(j=b[i];j<=e[i];j++)
                p[j]+=1;
        }
        
        while(1)
        {
            //判断当前种的树是否满足要求
            flag = 0;
            for(i=0;i<h;i++)
            {
                cnt = 0;
                for(j=b[i];j<=e[i];j++)
                {
                    if(p[j] == -1)
                        cnt++;
                }
                if(cnt < t[i])
                {
                    flag = 1;//表示不满足条件
                    break;
                }else
                {
                    //种的树已经满足要求,就把这段路去除
                    for(j=b[i];j<=e[i];j++)
                    {
                        if(p[j]>0)
                            p[j]-=1;
                    }
                }
            }
            if(flag == 0)//所有条件都满足
                break;
            //找到被覆盖次数最多的点,并将其种上树,用-1标识
            for(i=1;i<=n;i++)
            {
                if(p[i] > 0)
                {
                    index = i;
                    break;
                }
            }
            //找到当前被覆盖次数最多的点
            for(i=1;i<=n;i++)
            {
                if(p[i]>p[index])
                    index = i;
            }
            //将被覆盖次数最多的点种上树
            p[index] = -1;
            
        }
        //计算
        cnt = 0;
        for(i=1;i<=n;i++)
        {
            if(p[i]==-1)
                cnt++;
        }
        printf("%d",cnt);
        free(p);p=0;
        free(b);b=0;
        free(e);e=0;
        free(t);t=0;
        return 0;
    }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 12月20日
  • 已采纳回答 12月12日
  • 创建了问题 11月15日

悬赏问题

  • ¥15 PointNet++的onnx模型只能使用一次
  • ¥20 西南科技大学数字信号处理
  • ¥15 有两个非常“自以为是”烦人的问题急期待大家解决!
  • ¥30 STM32 INMP441无法读取数据
  • ¥15 R语言绘制密度图,一个密度曲线内fill不同颜色如何实现
  • ¥100 求汇川机器人IRCB300控制器和示教器同版本升级固件文件升级包
  • ¥15 用visualstudio2022创建vue项目后无法启动
  • ¥15 x趋于0时tanx-sinx极限可以拆开算吗
  • ¥500 把面具戴到人脸上,请大家贡献智慧,别用大模型回答,大模型的答案没啥用
  • ¥15 任意一个散点图自己下载其js脚本文件并做成独立的案例页面,不要作在线的,要离线状态。