这个是问题,该如何用c语言来做,不要用c++,因为我还没学数据结构与算法,所以贪心算法请用数组来做
3条回答 默认 最新
- 技术专家团-小桥流水 2022-11-15 21:02关注
代码如下:
#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; }
本回答被题主选为最佳回答 , 对您是否有帮助呢?解决 1无用
悬赏问题
- ¥15 PointNet++的onnx模型只能使用一次
- ¥20 西南科技大学数字信号处理
- ¥15 有两个非常“自以为是”烦人的问题急期待大家解决!
- ¥30 STM32 INMP441无法读取数据
- ¥15 R语言绘制密度图,一个密度曲线内fill不同颜色如何实现
- ¥100 求汇川机器人IRCB300控制器和示教器同版本升级固件文件升级包
- ¥15 用visualstudio2022创建vue项目后无法启动
- ¥15 x趋于0时tanx-sinx极限可以拆开算吗
- ¥500 把面具戴到人脸上,请大家贡献智慧,别用大模型回答,大模型的答案没啥用
- ¥15 任意一个散点图自己下载其js脚本文件并做成独立的案例页面,不要作在线的,要离线状态。