首页 > 其他分享 >从CF1935C看带反悔的贪心和multiset

从CF1935C看带反悔的贪心和multiset

时间:2024-03-06 11:57:49浏览次数:50  
标签:std arr 看带 int cur 反悔 x2 multiset CF1935C

Problem - C - Codeforces.

思路

首先很显然对 \(b\) 数组排序能最小化 \(b\) 的花费。

难点在 \(a\) 的选择,因为已经对 \(b\) 排序,不可能再兼顾 \(a\) 的优劣,所以 \(a\) 需要类似枚举的技术,这是一个类似搜索最优子集的问题,可以用 \(DP\),但是更可以贪心

带反悔的贪心

这类问题就是尽可能的取最优的,一旦发现不符合条件了,就反悔,把已选择中的最劣的逐出方案。

这题是可以这样做的,因为 \(b\) 排序之后,对于每个要枚举的起点 \(L\),哪怕把其中一个方案逐出了,也只要减去这个方案的 \(a\) 值即可,因为 \(b\) 值恒等于 \(R - L\) 的差。

针对本题,对于每一个 \(L\) 起点,都不停的选后方的 \(a\) ,一旦不符合条件,就把已选择的最大的 \(a\) 逐出方案。

实现

  • 我们需要一个数据结构来维护 \(a\) 的最大值,支持删除插入。
    • \(\texttt{std::multiset}\)
      • extract
        • 删除,且迭代器不失效
      • *rebegin()
        • 取最大

代码

struct Message {
    int a, b;
};
void solve() {
    int n, l;
    std::cin >> n >> l;
    std::vector<Message> arr(n);
    for (int i = 0; i < n; i++) std::cin >> arr[i].a >> arr[i].b;
    std::sort(all(arr), [&](auto& x1, auto& x2) {
        if (x1.b == x2.b) return x1.a < x2.a;
        return x1.b < x2.b;
    });
    int ans(0);
    for (int L = 0; L < n; L++) {
        std::multiset<int> S;
        int cur(0);
        for (int R = L; R < n; R++) {
            S.insert(arr[R].a);
            cur += arr[R].a;
            while(!S.empty() and arr[R].b - arr[L].b + cur > l) {//一旦不符合条件,就反悔
                int max_value(*S.rbegin());
                cur -= max_value;
                S.extract(max_value);//精确删除元素,避免迭代器失效
            }
            ans = std::max(ans, sz(S));//维护出以L起点取到的最大值
        }
    }
    std::cout << ans << '\n';
}

标签:std,arr,看带,int,cur,反悔,x2,multiset,CF1935C
From: https://www.cnblogs.com/kdlyh/p/18056210

相关文章

  • [ARC104D] Multiset Mean
    考虑计算和为\(x\)的方案时,把所有的数减去\(x\),dp出和等于\(0\)的。减去后数被分为三段,小于\(0\),等于\(0\)和大于\(0\)。其中等于\(0\)的直接乘上即可,对于正负,上下都是对称的,直接dp出\(f_{i,j}\)表示用了前\(i\)个数和为\(j\)的方案书,使用前缀和优化,最后......
  • set/multiset
    set/multiset容器Set的特性是。所有元素都会根据元素的键值自动被排序。Set的元素不像map那样可以同时拥有实值和键值,set的元素即是键值又是实值。Set不允许两个元素有相同的键值。我们可以通过set的迭代器改变set元素的值吗?不行,因为set元素值就是其键值,关系到set元素的排序规......
  • 【LeetCode1747. 应该被禁止的 Leetflex 账户】[MySQL 用户变量/Pandas]面向过程编程;
    目录题目地址MySQL代码等效pandas代码题目地址https://leetcode.cn/problems/leetflex-banned-accounts/description/MySQL代码witht1as(selectaccount_id,ip_address,loginastick,"login"asmytypefromLogInfounionallselectaccount_id,ip......
  • 【LeetCode1747. 应该被禁止的 Leetflex 账户】MySQL用户变量编程;尝试维护一个multise
    题目地址https://leetcode.cn/problems/leetflex-banned-accounts/description/代码witht1as(selectaccount_id,ip_address,loginastick,"login"asmytypefromLogInfounionallselectaccount_id,ip_address,logoutastick......
  • C++STL常用关联式关联容器(set/multiset , map/multimap)
    2.1set/multiset容器2.1.1set基本概念简介:所有元素都会在插入时自动被排序本质:set/multiset属于关联式容器,底层结构是用二叉树实现。set和multiset区别:set不允许容器中有重复的元素multiset允许容器中有重复的元素2.1.2set构造和赋值功能描述:创建set容器以及赋值构造:set<T>st......
  • C. Game with Multiset
    原题链接反思:要把各种可能的情况都判断一遍再提交!不要急着提交简介仓库里有若干个二次方数,请问是否能取出若干数使得刚好等于给定数?情况讨论情况1.仓库里只有一个4,但是我要求2,求不得情况2.仓库里有三个1,我要求3,能求大概思路从\(i\in[log2(v),0]\)遍历(从大到小),如果对于i,仓......
  • [ARC104D] Multiset Mean 题解
    题意给定\(N,K\)和\(M\)。对于每个大小在\([1,N]\)中的\(x\),求每个元素大小在\([1,N]\)中,平均数为\(x\)且相同元素不超过\(K\)个的可重集的数量,对\(M\)取模。\(1\leN,K\le100\),\(M\)为质数。题解发现对于\(x\),若存在一个合法的集合\(S\),那么有\[\sum\li......
  • multiset 用法
    头文件#include<set>代码#include<set>#include<iostream>usingnamespacestd;intmain(){ multiset<int>ms; ms.insert(1); ms.insert(5); ms.insert(5); ms.insert(5); ms.insert(2); ms.insert(1); for(autoiter=ms.be......
  • Count of Sub-Multisets With Bounded Sum
    CountofSub-MultisetsWithBoundedSumYouaregivena 0-indexed array nums ofnon-negativeintegers,andtwointegers l and r.Return the countofsub-multisets within nums wherethesumofelementsineachsubsetfallswithintheinclusiv......
  • 5771: 小明的账单 multiset
    描述  小明在一次聚会中,不慎遗失了自己的钱包,在接下来的日子,面对小明的将是一系列的补卡手续和堆积的账单…在小明的百般恳求下,老板最终同意延缓账单的支付时间。可老板又提出,必须从目前还没有支付的所有账单中选出面额最大和最小的两张,并把他们付清。还没有支付的账单会被......