题解-CF436E Cardboard Box
题面
\(n\) 个关卡,对每个关卡可以花 \(a_i\) 时间得到 \(1\) 颗星,或花 \(b_i\) 时间得到 \(2\) 颗星,或不玩。问获得 \(m\) 颗星最少需要多少时间。
数据范围:\(1\le n\le 3\cdot 10^5\),\(1\le m\le 2n\),\(a_i<b_i\)。
题解
蒟蒻做这题时已经知道是反悔贪心了,但是做了 \(4\) 个小时做不出来。于是去看题解,感觉这个 \(5\) 堆做法太非人类了,于是去看
CF题解和代码后总结出了蒟蒻的不用反悔贪心的做法和题解。
如果不反悔贪心,那么每一步必须保证没有后效性地最优。
很明显如果只有 \(a_i\),排序可以满足这个条件。
这题最朴素的错误做法是用一个小顶堆,刚开始把所有 \(a_i\) 丢进去,然后 \(m\) 次每次取堆顶,如果选了 \(a_i\) 把 \(b_i-a_i\) 也丢进去。
如果 \(a_i\) 都很大,\(b_i-a_i\) 都很小这样显然是亏的。
假如某个 \(i\) 打出 \(2\) 星是当前最优,如果 \(a_i\) 已经取了按照上面的办法肯定没有问题;但是如果 \(a_i\) 都没取,\(a_i\) 不一定是单个中的最优。
所以这篇题解最重要的骚操作就来了:选之前权衡,选两个的最优还是一个的最优:哪个更优?
可以用一个 vis 数组记录打了那些关卡,每次把打了的从堆中扔掉,这样就可以假定堆中的都是没有打过的了。
代码
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef double db;
#define x first
#define y second
#define bg begin()
#define ed end()
#define pb push_back
#define mp make_pair
#define sz(a) int((a).size())
#define R(i,n) for(int i(0);i<(n);++i)
#define L(i,n) for(int i((n)-1);~i;--i)
const int iinf=0x3f3f3f3f;
const ll linf=0x3f3f3f3f3f3f3f3f;
//Data
const int N=3e5,sN=N<<1;
int n,m,star[N];
ll a[sN],ns; bool vis[sN];
priority_queue<pair<ll,int>> o,t;
void ref(priority_queue<pair<ll,int>> &q){
while(sz(q)&&vis[q.top().y]) q.pop();
}
//Main
int main(){
ios::sync_with_stdio(0);
cin.tie(0),cout.tie(0);
cin>>n>>m;
R(i,n) cin>>a[i]>>a[i+n],a[i+n]-=a[i],
o.push(mp(-a[i],i)),t.push(mp(-a[i]-a[i+n],i));
while(m--){
ref(o),ref(t);
int i=o.top().y; o.pop(),ref(o);
if(m&&sz(t)&&a[i]-o.top().x>=-t.top().x)
o.push(mp(-a[i],i)),i=t.top().y,t.pop();
i<n&&(o.push(mp(-a[i+n],i+n)),true);
ns+=a[i],star[i%n]++,vis[i]=true;
}
cout<<ns<<'\n';
R(i,n) cout<<star[i],i==n-1&&(cout<<'\n');
return 0;
}
/*
可以考虑不反悔:权衡一个两个哪个优!
*/
祝大家学习愉快!
题解-CF436E Cardboard Box的更多相关文章
- CF436E Cardboard Box(贪心)
题意 有nnn个关卡,第iii关可以花费aia_iai的代价打一颗星,bib_ibi的代价打两颗星.保证1≤ai<bi≤1091\le a_i<b_i\le10^91≤ai<b ...
- Codeforces 436E Cardboard Box (看题解)
Cardboard Box 贪了个半天贪不对, 我发现我根本就不会贪心. 我们先按b排序, 然后枚举选两颗心的b的最大值, 在这个之前的肯定都要选一个, 因为前面的要是一个都没选的话, 你可以把当前选 ...
- 题解 CF1428A 【Box is Pull】
通过理解题意,我们发现: 当需要拐弯的时候,兔子需要先走回箱子的位置,再走向拐弯的方向.则拐弯操作的花费为 \(2\) .而直行的操作花费为 \(1\) . 所以, 如果不需要拐弯,也就是 \(x1= ...
- Codeforces 436E - Cardboard Box(贪心/反悔贪心/数据结构)
题面传送门 题意: 有 \(n\) 个关卡,第 \(i\) 个关卡玩到 \(1\) 颗星需要花 \(a_i\) 的时间,玩到 \(2\) 颗星需要 \(b_i\) 的时间.(\(a_i<b_i\ ...
- upc组队赛12 Cardboard Container【枚举】
Cardboard Container Problem Description fidget spinners are so 2017; this years' rage are fidget cub ...
- uva 580 危险的组合(排列组合)
Time Limit: 3000MS Memory Limit: Unknown 64bit IO Format: %lld & %llu Submit Status Descript ...
- CF数据结构练习
1. CF 438D The Child and Sequence 大意: n元素序列, m个操作: 1,询问区间和. 2,区间对m取模. 3,单点修改 维护最大值, 取模时暴力对所有>m的数取 ...
- SGU 495. Kids and Prizes
水概率....SGU里难得的水题.... 495. Kids and Prizes Time limit per test: 0.5 second(s)Memory limit: 262144 kil ...
- Kids and Prizes(SGU 495)
495. Kids and Prizes Time limit per test: 0.25 second(s)Memory limit: 262144 kilobytes input: standa ...
随机推荐
- 1、线性DP 213. 打家劫舍 II
https://leetcode-cn.com/problems/house-robber-ii/ //rob 0, not rob n-1 || not rob 0,not rob n-1 ==&g ...
- selenium之 定位以及切换frame(iframe)(转)
frame标签有frameset.frame.iframe三种,frameset跟其他普通标签没有区别,不会影响到正常的定位,而frame与iframe对selenium定位而言是一样的,seleni ...
- uiautomatorviewer 启动报错
我的sdk是随着AndroidStudio中下载下来的,这样做是有好处的,建议直接装个AndroidStudio这样管理sdk很方便,虽然很大,但是总比后期发现有问题好一点.最近在研究Appium要定 ...
- 详解scanf与getchar
原文: (https://www.myjinji.top/articles/2020/07/22/1595399358246.html)[https://www.myjinji.top/article ...
- webpack、node、npm关系
webpack模块打包 webpack为了正常运行, 必须依赖node环境, node环境为了可以正常的执行很多代码,必须其中包含各种依赖的包 npm工具(node packages manager) ...
- python-网络安全编程第九天(json模块、zoomeye采集)
前言 其实这篇应该是昨天必须完成的但是昨天emmmmm 学习进度有点慢 今天早上起来早点完成了这些的学习 昨天计划学习内容还差一道CTFemmm 不管了 先写一下今天的计划 开始锻炼身体去. pyth ...
- Java 枚举 enum 详解
本文部分摘自 On Java 8 枚举类型 Java5 中添加了一个 enum 关键字,通过 enum 关键字,我们可以将一组拥有具名的值的有限集合创建为一种新的类型,这些具名的值可以作为常规的程序组 ...
- ABBYY FineReader 14如何查看PDF文档
使用 ABBYY FineReader,您可以轻松查看和编辑任何类型的 PDF文档,就像是一款功能强大的PDF编辑转换器,不仅如此,它还能够允许您复制其中的文本.图片和表格.本文我们来看看如何从&qu ...
- 如何用MathType 7输入x的一阶导数
物理学.几何学.经济学等学科中的一些重要概念都可以用导数来表示.如,导数可以表示运动物体的瞬时速度和加速度.可以表示曲线在一点的斜率.还可以表示经济学中的边际和弹性.那么作为专业的公式编辑器,如何输入 ...
- Linux-CentOS7下安装Oracle11g
简述: 本文操作环境采用CentOS7 Linux安装Oracle11g与Windows区别较大,在Linux下需要创建用户以及用户组来供Oracle使用 Windows可以直接图形化界面从第一步到最 ...