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

种树问题请用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 怎样才能让鼠标沿着线条的中心线轨迹移动
  • ¥60 用visual studio编写程序,利用间接平差求解水准网
  • ¥15 Llama如何调用shell或者Python
  • ¥20 谁能帮我挨个解读这个php语言编的代码什么意思?
  • ¥15 win10权限管理,限制普通用户使用删除功能
  • ¥15 minnio内存占用过大,内存没被回收(Windows环境)
  • ¥65 抖音咸鱼付款链接转码支付宝
  • ¥15 ubuntu22.04上安装ursim-3.15.8.106339遇到的问题
  • ¥15 blast算法(相关搜索:数据库)
  • ¥15 请问有人会紧聚焦相关的matlab知识嘛?