首页 > 其他分享 >贪心

贪心

时间:2024-08-06 12:50:15浏览次数:9  
标签:res ll 反悔 贪心 sum define

有些题 dp 是难做的或做不了的,这个时候可以去设计一种策略使得决策尽可能最优,也就是贪心。可以说贪心有时候是一种乱搞,但乱搞也能搞出出题人想不到的正解。

反悔贪心

有些题中直接 dp 的复杂度很高并且很难优化或者有后效性无法 dp,朴素贪心考虑可以做到 \(O(n)\) 但是无法保证正确性,这个时候可以使用反悔贪心,在一般是 \(O(n\log n)\) 的时间内完成问题的求解。

相对于普通贪心而言,反悔贪心特殊的点在于“反悔”操作。普通贪心在完成某个阶段的求解后就不会再管那个阶段的决策是否最优,求的是局部最优解而不一定是全局最优解,但反悔贪心可以改变之前的决策,即“反悔”操作。按照判断方式的不同,反悔贪心可以分为反悔堆反悔自动机两种方法,一般都用到了优先队列实现。

大概流程:先按普通贪心的思路做,用一个优先队列记录每个决策点的决策,当判断出不优的情况就从优先队列中取出最大/小的元素,也就是对之前的决策进行反悔操作,并更新答案。反悔贪心有一些模型,并且贪心题都还是重在思维的锻炼和积累,多做点题吧,还能学 OI 的日子不多了。

P2107 小Z的AK计划

价值一定模型。但这个题比较简单。

首先很明显,我们一定是按 \(x_i\) 从小到大来选点,回头一定不优,所以先把所有点按 \(x\) 排序。贪心过程中每次加入点时先累加上所需时间,把这个点塞入大根堆中,如果累计花费时间 \(>m\) 那么就将堆顶元素,也就是耗时最大的点取出,总时间减去 \(t_i\),但注意不要减去 \(x_i-x_{i-1}\),因为路过的时间是必须要算的。还有注意每次取完点后答案都要取最大值。

点击查看代码
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define pi pair<ll,ll>
#define fi first
#define se second
const ll N=114514,M=1919810,inf=1e18;
ll n,m,ans,res;
priority_queue <ll> q;
struct xx{
	ll x,t;
}a[N];
bool cmp(xx x,xx y){
	return x.x<y.x;
}
int main(){
	ios::sync_with_stdio(0);
	cin.tie(0); cout.tie(0);
	cin>>n>>m;
	for(int i=1;i<=n;++i) cin>>a[i].x>>a[i].t;
	sort(a+1,a+n+1,cmp);
	ll sum=0;
	for(int i=1;i<=n;++i){
		if(a[i].x>m) break;
		sum+=a[i].t+a[i].x-a[i-1].x,++res;
		q.push(a[i].t);
		if(sum>m){
			sum-=q.top(),--res;
			q.pop();
		}
		ans=max(ans,res);
	}
	cout<<ans;
	return 0;
}//好像也没多难? 

标签:res,ll,反悔,贪心,sum,define
From: https://www.cnblogs.com/heshuwan/p/18344593

相关文章

  • 贪心系列专题篇四
    目录整数替换解法一解法二俄罗斯套娃信封问题堆箱子可被三整除的最大和距离相等的条形码重构字符串声明:接下来主要使用贪心法来解决问题!!!整数替换题目思路下面将使用两种方法来解决这道题,第一种方法是递归+记忆化搜索;第二种方法是贪心。解法一使用递归+记忆......
  • 贪心算法-活动安排问题
    贪心算法贪心算法总是选择当前看起来最优的选择(局部最优解),希望得到的结果是一个整体最优解。但是,并非总是选择局部最优解就能够得到整体最优解,这一点需要在问题具有贪心选择性和优化子结构时才成立。贪心选择性贪心选择性:第一次做出贪心选择是正确的。优化子结构问题......
  • 「Day 2—贪心问题&分治&前缀和」
    贪心问题定义顾名思义,越贪越好。。。习题P1094[NOIP2007普及组]纪念品分组思路简单来说:最少的+最多的,利用双指针。代码#include<algorithm>#include<iostream>usingnamespacestd;intw,n;intp[30005];intmain(){cin>>w;cin>>n;for(inti=1;i......
  • 贪心·区间问题
    区间问题Whatis贪心贪心:每一次只在当前这一块选择局部最优解,但最后可以走到全局最优解,只有一个问题是单方的,才可以使用贪心算法题目Acwing.905区间选点905.区间选点-AcWing题库举例:如图,需要选两个点,每个区间都有一个点,第1、2、3个区间内有第一个点,第4个区间包......
  • CF1883E+CF1995C-对数+贪心
    CF1883E+CF1995C对数+贪心CF1883ELookBack大致题意给你一个整数数组$a_1,a_2,…,a_n$。你需要用最少的运算次数使数组不递减。在一次操作中,您需要执行以下操作:选择一个索引\(1\leqi\leqn\)、设置$a_i=a_i⋅2$.数组\(b_1,b_2,…,b_n\)在所有$1\leqi\l......
  • 解密编程的八大法宝(三)(附贪心算法、动态规划和字符串匹配算法详解)
    算法题中常见的几大解题方法有以下几种:暴力枚举法(BruteForce):这是最基本的解题方法,直接尝试所有可能的组合或排列来找到答案。这种方法适用于问题规模较小的情况,但在大多数情况下效率不高。贪心算法(GreedyAlgorithm):贪心算法在每一步都选择当前看起来最优的解,希望最终能......
  • Day 31 贪心算法 Part05
    56.合并区间区间这类问题,不是按照左端点排序就是按照右端点排序,在思考思路的时候,就从这两个方向去下手,然后再去想贪心,以及从左侧开始遍历还是右侧开始遍历。classSolution{publicint[][]merge(int[][]intervals){if(intervals.length==1)returninterva......
  • 「代码随想录算法训练营」第二十六天 | 贪心算法 part4
    452.用最少数量的箭引爆气球题目链接:https://leetcode.cn/problems/minimum-number-of-arrows-to-burst-balloons/题目难度:中等文章讲解:https://programmercarl.com/0452.用最少数量的箭引爆气球.html视频讲解:https://www.bilibili.com/video/BV1SA41167xe题目状态:有点思路......
  • 「代码随想录算法训练营」第二十五天 | 贪心算法 part3
    134.加油站题目链接:https://leetcode.cn/problems/gas-station/题目难度:中等文章讲解:https://programmercarl.com/0134.加油站.html视频讲解:https://www.bilibili.com/video/BV1jA411r7WX题目状态:没有思路,学习题解思路一:全局最优解首先将所有路径的加油量和耗油量加一起......
  • 洛谷P3161 [CQOI2012] 模拟工厂 贪心策略的思考
    P3161[CQOI2012]模拟工厂传送门:模拟工厂问题描述:初始的生产力和商品分别为1和0。每一个时刻可以选择两个动作:生产力+1或者生产生产力数量的商品。现在有很多个订单,每个订单有三个部分:时间t,需要多少商品p,可以获得的价值v。现在需要决定各个时刻的动作选择,以及订单是否接取,以期......