首页 > 其他分享 >贪心:临项交换 & 带悔贪心

贪心:临项交换 & 带悔贪心

时间:2023-05-12 16:47:55浏览次数:29  
标签:带悔 临项 int 选择 奶牛 贪心

模拟赛遇见临项交换和带悔贪心时确实想了一下他们的区别和应用范围,因为差点用错,但并没有深入思考。今天老师又提到了这个问题,来写一下。


 

一般这一类题目的特点:需要选择的元素有两个权值,均对所求答案的排列顺序、统计造成影响。

 

临项交换:排序,每次用相邻两项进行比较交换。

一般思路:如果先选 a 再选 b,这种选择的先后顺序会对 b 造成什么影响。若先选 b 再选 a,这种选择的顺序对 a 又造成什么影响。影响一般就指代价。然后比较两种代价,哪一种排序方式的代价最小就采取哪种。

我们注意到这种交换,对于这两项之外的其他项都不会造成影响,只对两项自身选择有影响。所以仅在对于其他项不会对相邻两项产生影响的情况下可以使用。

 


带悔贪心:选择时无论当前的选项是否最优都存下来,在后面的选择中与之进行比较,如果选择之后不再最优,则反悔,舍弃掉这个选项;否则,正式接受。如此往复。

可以发现,这类题目中,当前的选择不光对自己有影响,也会对序列中其他项的选择情况造成影响。

常用优先队列维护之前已经选择的选项。一般难度在于怎么反悔。

 

感觉带悔贪心还是比较抽象的。


一个临项交换例题:洛谷 P1842 奶牛玩杂技。本来想贴国王游戏,那道题确实更经典,但是发现我没写,因为需要高精度,而且题目本身也略复杂不适合做例题(?)(别问,问就是找借口)(不重要了,有空会补上。)

大概就是说每个奶牛有自己的体重 w 和力量 s,奶牛需要叠放在一起,对于下面的牛受到的压力,是其上的奶牛重量和累加,如果超出其力量则会产生危险指。找一个排列顺序使得所有奶牛最大的危险指数最小。(这个时候刚看到有最大值最小,那么也能用二分做)

 

#include<bits/stdc++.h>
#define ll long long
using namespace std;
int n;
ll ans = -0x7fffffff, tot = 0;
struct niu{int w;ll s;} a[50010];
bool cmp(niu x, niu y) {return x.s + x.w < y.s + y.w;}
int main()
{
    scanf("%d", &n);
    for(int i = 1; i <= n; i ++ ) scanf("%d%d", &a[i].w, &a[i].s);
    sort(a + 1, a + n + 1, cmp);
    for(int i = 1; i <= n; i ++ )
        {
        ans = max(ans, tot - a[i].s);
        tot += a[i].w;
    }
    printf("%lld", ans);
    return 0;
}    
View Code

 

标签:带悔,临项,int,选择,奶牛,贪心
From: https://www.cnblogs.com/Moyyer-suiy/p/17395051.html

相关文章

  • 浅谈一类反悔贪心的问题
    种树在长度为\(n\)的数列中选择至少\(k\)个数字,他们都有价值,使得没有相邻的数字被取到,且数字之和最大。求这个最大的数字之和。我们考虑一个反悔贪心,首先用一个链表来维护数列,然后,每次贪心的选择最大的数字,并标记左右不可用。但是这个贪心显然是错的,我们再直接将这三个......
  • E. Generate a String(典:贪心+动态规划)
    题目E.GenerateaString题意输入三个不同的整数\(n(1\leqn\leq10^7),x,y(1 ≤ x, y ≤ 10^9)\)。从0开始,每次可以+1,-1,代价是x,或者当前值*2,代价是y问怎样才能到达n用最小的代价思路第一方法是暴力搜索,但是数据过大,不行观察发现,如果从n出发,做所有操......
  • (hdu step 9.1.2)Doing Homework again(贪心——有n份作业,每份作业都有一定的完成时
    题目:DoingHomeworkagainTimeLimit:1000/1000MS(Java/Others)MemoryLimit:32768/32768K(Java/Others)TotalSubmission(s):63AcceptedSubmission(s):57 ProblemDescriptionIgnatiushasjustcomebackschoolfromthe30thACM/ICPC.Nowheha......
  • 拼接最大数(栈、贪心)、发奖金问题、二叉搜索树迭代器(栈、树)
    拼接最大数(栈、贪心)给定长度分别为m和n的两个数组,其元素由0-9构成,表示两个自然数各位上的数字。现在从这两个数组中选出k(k<=m+n)个数字拼接成一个新的数,要求从同一个数组中取出的数字保持其在原数组中的相对顺序。求满足该条件的最大数。结果返回一个表示该最大......
  • LeetCode 周赛 343(2023/04/30)结合「下一个排列」的贪心构造问题
    本文已收录到AndroidFamily,技术和职场问题,请关注公众号[彭旭锐]提问。大家好,我是小彭。今天是五一假期的第二天,打周赛的人数比前一天的双周赛多了,难道大家都只玩一天吗?这场周赛是LeetCode第343场单周赛,如果不考虑第一题摆烂的翻译,整体题目质量还是很不错哒。往期回顾:L......
  • Educational Codeforces Round 147 (Rated for Div. 2) (贪心)
    原题链接:https://codeforces.com/contest/1821/problem/D*题意:从1开始走,走的给定区间的值要k次。且shift按了要松开,代表走了一个区间除了往右的次数,还要多两次按shift的次数,求最小次数。*思路:1.先把不可能的情况列出来,就是给出的区间大小小于k时直接输出-12.我的思路是暴......
  • [POI2005]SAM-Toy Cars 题解(贪心+堆)
    题面首先考虑一个贪心策略:当地板已经放满需要取出一个时,取下一次使用时间\(nxt\)最晚的那个。所以我们只需要一个可以快速求出一个集合中\(nxt\)最小的点并删除,插入新点的数据结构,这里很容易想到堆。代码很简洁,注意数组的下标是位置还是颜色(考场100pts到0pts)。code:......
  • [ZJOI2020] 序列 线性规划做法/贪心做法
    线性规划做法同时也作为线性规划对偶的一个小小的学习笔记。以下\(\cdot\)表示点积,\(b,c,x,y\)是行向量。\(A\)是矩阵,对于向量\(u,v\)若\(\foralli,u_i\leqv_i\)则称\(u\leqv\),\(\geq\)同理。线性规划标准型:\[\maxc\cdotx\\s.t.\left\{\begin{aligned}&Ax......
  • POJ--1328 Radar Installation(贪心)
    记录0:502023-5-1http://poj.org/problem?id=1328reference:《挑战程序设计竞赛(第2版)》第二章练习题索引p135DescriptionAssumethecoastingisaninfinitestraightline.Landisinonesideofcoasting,seaintheother.Eachsmallislandisapointlocating......
  • 题目 3158: 蓝桥杯2023年第十四届省赛真题-三国游戏(贪心)
    题目描述小蓝正在玩一款游戏。游戏中魏蜀吴三个国家各自拥有一定数量的士兵X,Y,Z(一开始可以认为都为0)。游戏有n个可能会发生的事件,每个事件之间相互独立且最多只会发生一次,当第i个事件发生时会分别让X,Y,Z增加Ai,Bi,Ci。当游戏结束时(所有事件的发生与否已......