首页 > 其他分享 >chapter7-贪心策略-区间贪心

chapter7-贪心策略-区间贪心

时间:2024-03-07 20:47:29浏览次数:20  
标签:arr int chapter7 time 区间 include 贪心

2.区间贪心

区间贪心也是一种常见的贪心策略类的题型。它是指当有多个不同的区间存在,且这些区间有可能相互重叠的时候,如何选择才能从众多区间中,选取最多的两两互不相交的区间。

今年暑假不AC

杭电 OJ 2037

看尽可能多的节目:贪心策略

问题分析:区间贪心和简单贪心不同的地方在于决定怎么贪,题目给了我们节目的开始时间、结束时间、持续时间,本题的贪心策略是什么呢,使得当前子问题获得最优解?

显然,(1)开始时间最早、(2)持续时间最短,都可以想到特例不满足题目的最优解。

(3)结束时间最早,这就是本题需要的贪心策略,因为结束时间越早,剩下的时间就越多,可选择的节目余地就越多,这样就获得了当前子问题的最优解。
今年暑假不AC.jpg

今年暑假不AC
//区间贪心学习-看尽可能多的节目 2024-03-07
#include <iostream>
#include <cstdio>
#include <algorithm>

using namespace std;

const int MAXN = 100 + 10;

struct program {
    int start_time;
    int end_time;
};
program arr[MAXN];

bool Compare(program a, program b) {
    return a.end_time < b.end_time;
}

int main()
{
    int n;
    while(cin >> n) {
        if(0 == n) {
            break;
        }
        for(int i = 0; i < n; ++i) {
            cin >> arr[i].start_time >> arr[i].end_time;
        }
        sort(arr, arr + n, Compare);
        int current = 0;
        int answer = 0;
        for(int i = 0; i < n; ++i) {
            if(current <= arr[i].start_time) {
                current = arr[i].end_time;
                ++answer;
            }
        }
        cout << answer << endl;
    }
    return 0;
}

POJ 1328 Radar Installation

POJ 安装雷达

题目的诉求,以及该怎么贪

尽可能少的雷达站:贪心策略

问题分析:在海岸线的某个点安装一个雷达,便可以以这个点为圆心,以\(d\)为半径作为覆盖范围;海岸线是无线长的一条直线,而岛屿是有限个(<=1000)。

如果我们从海岸线的角度来思考这个问题实际上非常困难,因为海岸线上有无数个点,如何抉择安装位置很难。在海岸线的哪些点上安装雷达能覆盖全部的岛屿

所以要转换一下问题,从岛屿的角度思考问题,要覆盖这个岛屿,你必须在海岸线的哪个位置装雷达

可安装区间分析.jpg
区间尽可能重叠的情况下,安装尽可能少的雷达。
雷达贪心策略.jpg

Radar Installation
//区间贪心学习-安装尽可能少的雷达 2024-03-07
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>

using namespace std;

const int MAXN = 1000 + 10;

struct avail {
    double start_pos;
    double end_pos;
};
avail arr[MAXN]; //保存区间

bool Compare(avail a, avail b) {
    return a.start_pos < b.start_pos; //区间尽可能重叠
}

int main()
{
    int n, d, x, y;
    int caseNumer = 0;
    while(cin >> n >> d) {
        if(0 == n && 0 == d) {
            break;
        }
        bool flag  = true;
        for(int i = 0; i < n; ++i) {
            cin >> x >> y;
            if(y <= d) {
                double r = sqrt((double)d * d - y * y);
                arr[i].start_pos = x - r;
                arr[i].end_pos = x + r;
            } else {
                flag = false;
            }
        }
        if(!flag) {
            printf("Case %d: %d\n", ++caseNumer, -1);
        } else {
            sort(arr, arr + n, Compare);
            double current = arr[0].end_pos;
            int answer = 1;
            for(int i = 1; i < n; ++i) {
                if(arr[i].start_pos <= current) {
                    current = min(current, arr[i].end_pos);
                } else { //没有重叠
                    current = arr[i].end_pos;
                    ++answer;
                }
            }
            printf("Case %d: %d\n", ++caseNumer, answer);
        }
    }
    return 0;
}

注意,代码中用到的sqrt函数、ceil函数、floor函数,均需要调用cmath,并且输入的参数必须为浮点数类型,如果是整数,就要强制转换或者乘上\(1.0\)

标签:arr,int,chapter7,time,区间,include,贪心
From: https://www.cnblogs.com/paopaotangzu/p/18059697

相关文章

  • chapter7-贪心策略1-简单贪心
    贪心策略:总是做出当前最好的选择。给你一个大的问题,贪心策略分为三步走:问题分解成为多个子问题;子问题求局部最优解;局部最优解组合成原问题的解。适用范围:如果这类最优化问题具备无后效性,即某个状态以前的过程不会影响以后的状态,而只与当前状态有关,就能保证使用贪心策......
  • 从CF1935C看带反悔的贪心和multiset
    Problem-C-Codeforces.思路首先很显然对\(b\)数组排序能最小化\(b\)的花费。难点在\(a\)的选择,因为已经对\(b\)排序,不可能再兼顾\(a\)的优劣,所以\(a\)需要类似枚举的技术,这是一个类似搜索最优子集的问题,可以用\(DP\),但是更可以贪心带反悔的贪心这类问题就......
  • 由区间合并->离散化
    `#include<iostream>#include<cstring>#include<vector>#include<algorithm>usingnamespacestd;typedefpair<int,int>PII;//数对type-类型define-定义pair-一对constintN=300......
  • (36/60)无重叠区间、划分字母区间、合并区间
    无重叠区间leetcode:435.无重叠区间贪心法思路去掉最少的区间数就是最少重叠区间对的个数。(成对的算,因为一对里面需要去掉一个)类似射气球的处理方式。左边界法:按左边界从小到大排序。遍历每个元素。取当前元素右边界为right判断是否重叠。如果[i]right>[i+1]left......
  • 代码随想录算法训练营第三十六天 | 56. 合并区间,763.划分字母区间,435. 无重叠区间
    435.无重叠区间 已解答中等 相关标签相关企业 给定一个区间的集合 intervals ,其中 intervals[i]=[starti,endi] 。返回 需要移除区间的最小数量,使剩余区间互不重叠 。 示例1:输入:intervals=[[1,2],[2,3],[3,4],[1,3]]输出:1解......
  • 代码随想录算法训练营第三十六天| ● 435. 无重叠区间 ● 763.划分字母区间 ● 56.
    无重叠区间 题目链接:435.无重叠区间-力扣(LeetCode)思路:我的思路是先将所有区间按左端点从小到大排序,左端点相同时右端点从小到大排序。接下来遍历数组,如果下一个区间与该区间有重叠部分,count加1,同时遍历下下一个区间(下一个区间被视为删除),同时如果下一个区间被包含在该区间中,......
  • Luogu P1220 关路灯 题解 [ 蓝 ][ 区间dp ]
    关路灯题目描述某一村庄在一条路线上安装了\(n\)盏路灯,每盏灯的功率有大有小(即同一段时间内消耗的电量有多有少)。老张就住在这条路中间某一路灯旁,他有一项工作就是每天早上天亮时一盏一盏地关掉这些路灯。为了给村里节省电费,老张记录下了每盏路灯的位置和功率,他每次关......
  • 246. 区间最大公约数
    #include<cstdio>#include<cstring>#include<iostream>#include<algorithm>usingnamespacestd;typedeflonglongLL;constintN=500010;intn,m;LLw[N];structNode{intl,r;LLsum,d;}tr[N*4];LLgcd(LL......
  • 最大字段和,区间矩阵
    最大字段和原题链接:P1115最大子段和-洛谷|计算机科学教育新生态(luogu.com.cn)解析:经典动态规划:最大子数组问题-知乎(zhihu.com)我写的代码:#include<iostream>#include<algorithm>#include<cstring>usingnamespacestd;constintN=2e5+10;inta[N],dp[N]......
  • C++新U4-贪心算法1
    学习目标贪心算法的概念[【贪心算法(一)】书架]    【题意分析】选出最少的奶牛数量,让他们的身高相加超过书架的高度。【思路分析】优先选择身高高的奶牛,这样子奶牛使用的数量最少。定义排序规则,将数从大到小排序定义奶牛数量n和书架高度b,并且输入输......