贪心算法训练(五)——种树

1. 问题描述

  一条街道的一边有几座房子,因为环保原因居民想要在路边种些树,路边的地区被分割成 n 块,并被编号为 1…n,每块大小为一个单位尺寸并最多可以种一棵树,每个居民想在门前种些树并指定了三个数 b,e,t 这三个数分别表示该居民想在 b 和 e 之间最少种 t 棵树,当然,b<=e,t<=e-b+1 ,允许居民想种树的子区域可以交叉。出于资金紧缺的原因,环保部门请你求出能满足所有居民的种树要求时所需树的最少数量

2.输入格式

  第一行为 n,表示区域的个数

  第二行为 h,表示房子的数目

  下面 h 行描述居民的需要:b,e,t (0 < b <= e <= 30000,t <= e-b+1)分别用空格分开

3. 输出格式

  输出一个数,为满足所有居民的要求,所需要种树的最少数量

4. 样例输入

  9

  4

  1 4 2

  4 6 2

  8 9 2  

  3 5 2

5, 样例输出

  5

6. 思路分析

  按区间的末尾进行排序,从头开始,将区间的末尾加入队列,判断它是否存在于下个区间,如果存在,继续判断下一个区间,如果不存在,取下一个区间的末尾,继续判断,得到可以存在于公共位置的区间个数,就是可以节约的树的数量

7. 代码

#include <iostream>
#include <cstring>
#include <algorithm>

using namespace std;

void insertion_sort(int a[],int arr[],int len);

int main()
{
    ios::sync_with_stdio(false);
    int n,h,num = 0,sum = 0;
    int i = 0;
    cin>>n>>h;
    int start[h],end[h],tree[h];
    for(; i < h; i++)
        cin>>start[i]>>end[i]>>tree[i];
    insertion_sort(start,end,h);
    int mark = end[0];
    for(i = 0;i<h;i++)
    {
        sum += tree[i];
        if(mark >= start[i])
            num++;
        else
            mark = end[i];
    }
    cout<<sum - num;
    return 0;
}
void insertion_sort(int a[],int arr[],int len)
{
    for(int i=1; i<len; i++)
    {
        int key=arr[i];int j;
        for(j=i-1; j>=0 && key<arr[j]; j--)
        {
            arr[j+1]=arr[j];
            a[j+1] = a[j];
        }
        arr[j+1]=key;
    }
}

原文地址:https://www.cnblogs.com/NikkiNikita/p/9458700.html

时间: 2024-10-16 23:16:46

贪心算法训练(五)——种树的相关文章

POJ1017 Packets(贪心算法训练)

Time Limit: 1000MS          Memory Limit: 10000K          Total Submissions: 51306          Accepted: 17391 Description A factory produces products packed in square packets of the same height h and of the sizes 1*1, 2*2, 3*3, 4*4, 5*5, 6*6. These pro

POJ1323 Game Prediction(贪心算法训练)

Time Limit: 1000MS          Memory Limit: 10000K          Total Submissions: 10475          Accepted: 5046 Description Suppose there are M people, including you, playing a special card game. At the beginning, each player receives N cards. The pip of

POJ1700 Crossing River(贪心算法训练)

Time Limit: 1000MS          Memory Limit: 10000K          Total Submissions: 13301          Accepted: 5087 Description A group of N people wishes to go across a river with only one boat, which can at most carry two persons. Therefore some sort of shu

蓝桥杯:算法训练之最大最小公倍数

算法训练 最大最小公倍数 时间限制:1.0s   内存限制:256.0MB 问题描述 已知一个正整数N,问从1~N中任选出三个数,他们的最小公倍数最大可以为多少. 输入格式 输入一个正整数N. 输出格式 输出一个整数,表示你找到的最小公倍数. 样例输入 9 样例输出 504 数据规模与约定 1 <= N <= 106. 注:贪心,从最大的三个数开始考虑,如果最大的数为奇数,那么相邻的三个数中有两个奇数,最大公约数为1,最小公倍数就为n(n-1)(n-2). 如果为偶数,那么往后移,考虑n(n-

贪心算法+实例

贪心算法(又称贪婪算法)是指,在对问题求解时,总是做出在当前看来是最好的选择.也就是说, 不从整体最优上加以考虑,他所做出的是在某种意义上的局部最优解.(官方解释). 所谓的贪心算法主要理解就在这个“贪心”上面,所谓贪心,就是找到最好的,也就是上面说的最优解. 我们可以通过各种方式找到当前的最优解,将最有解利用过后,将其清除,再去找下一个最优解. 来一个例子来说明. 题目描述 鲁宾逊先生有一只宠物猴,名叫多多.这天,他们两个正沿着乡间小路散步,突然发现路边的告示牌上贴着一张小小的纸条:“欢迎免费

算法导论——lec 13 贪心算法与图上算法

之前我们介绍了用动态规划的方法来解决一些最优化的问题.但对于有些最优化问题来说,用动态规划就是"高射炮打蚊子",采用一些更加简单有效的方法就可以解决.贪心算法就是其中之一.贪心算法是使所做的选择看起来是当前最佳的,期望通过所做的局部最优选择来产生一个全局最优解. 一. 活动选择问题 [问题]对几个互相竞争的活动进行调度:活动集合S = {a1, a2, ..., an},它们都要求以独占的方式使用某一公共资源(如教室),每个活动ai有一个开始时间si和结束时间fi ,且0 ≤ si &

贪心算法

一,贪心算法的设计思想 ? 从问题的某一个初始解出发逐步逼近给定的目标,每一步都作一个不可回溯的决策,尽可能地求得最好的解.当达到某算法中的某一步不需要再继续前进时,算法停止. 二,贪心算法的基本性质 1)贪心选择性质 所谓贪心选择性质是指所求问题的整体最优解可以通过一系列局部最优的选择,即贪心选择来达到.这是贪心算法可行的第一个基本要素,也是贪心法与动态规划法的主要区别. 2) 最优子结构性质 该问题解的整体最优性依赖于其局部子问题解的最优性.这种性质是可以采用贪心算法解决问题的关键特征.例如

分治法、动态规划、回溯法、分支界限法、贪心算法

转:http://blog.csdn.net/lcj_cjfykx/article/details/41691787 分治算法一.基本概念 在计算机科学中,分治法是一种很重要的算法.字面上的解释是“分而治之”,就是把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题……直到最后子问题可以简单的直接求解,原问题的解即子问题的解的合并.这个技巧是很多高效算法的基础,如排序算法(快速排序,归并排序),傅立叶变换(快速傅立叶变换)…… 任何一个可以用计算机求解的问题所需的计算时

贪心算法和动态规划算法

动态规划和贪心算法都是一种递推算法 即均由局部最优解来推导全局最优解 (不从整体最优解出发来考虑,总是做出在当前看来最好的选择.) 不同点: 贪心算法 与动态规划的区别:贪心算法中,作出的每步贪心决策都无法改变,由上一步的最优解推导下一步的最优解,所以上一部之前的最优解则不作保留. 能使用贪心法求解的条件:是否能找出一个贪心标准.我们看一个找币的例子,如果一个货币系统有三种币值,面值分别为一角.五分和一分,求最小找币数时,可以用贪心法求解:如果将这三种币值改为一角一分.五分和一分,就不能使用贪心