题解-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 ...
随机推荐
- InnoDB事务的二阶段提交
问题: 什么是二阶段提交 为什么需要二阶段提交 二阶段提交流程 什么是二阶段提交? ### 假设原来id 为10 的记录age 为5 begin; update student set age = 1 ...
- linux中/etc/passwd和/etc/shadow文件说明
/etc/passwd是用来存储登陆用户信息: [root@localhost test]# cat /etc/passwd root:x:0:0:root:/root:/bin/bash bin:x ...
- wireshark分析nmap和metasploit内置的syn扫描
syn扫描 syn扫描,根据三次握手,向端口发送syn包,如果对方回应SYN/ACK,则证明端口开放 首先是nmap 速度很快,0.67秒完成,看下wireshark的抓取 一次发送了大量的syn包 ...
- 关于oracle11g 和sqldeverloper的安装配置
0友情提示:以下下载地址都是我的百度云分享链接安全无毒请放心下载! 电脑配置 win10 jdk版本1.7 下载oracle11G 版本 下载地址:安装很简单 sqldverloper(oracleD ...
- 在 Spark 数据导入中的一些实践细节
本文由合合信息大数据团队柳佳浩撰写 1.前言 图谱业务随着时间的推移愈发的复杂化,逐渐体现出了性能上的瓶颈:单机不足以支持更大的图谱.然而,从性能上来看,Neo4j 的原生图存储有着不可替代的性能优势 ...
- FL Studio杂项设置页讲解(下)
上篇文章中我们重点讲解了FL Studio中"截断/被截"如何有效的避免个采样在播放时相互干扰的知识以及电平设置栏的知识,今天我们将讲完该页面中剩下的栏目知识,一起来看看吧! 1. ...
- 统一软件开发过程(RUP)的概念和方法
统一软件开发过程(Rational Unified Process,RUP)是一种面向对象且基于网络的程序开发方法论. 根据Rational(Rational Rose和统一建模语言的开发者)的说法, ...
- vue集成高德地图
vue集成高德地图 前言 二.使用步骤 1.注册高德开发平台 2.vue 结尾 前言 之前玩Thymeleaf的时候玩过高德地图,现在无聊Vue项目也整个地图进去~ 二.使用步骤 1.注册高德开发平台 ...
- 【ACwing 98】分形之城——分形
(题面来自ACwing) 城市的规划在城市建设中是个大问题. 不幸的是,很多城市在开始建设的时候并没有很好的规划,城市规模扩大之后规划不合理的问题就开始显现. 而这座名为 Fractal 的城市设想了 ...
- Java基础教程——命令行运行Java代码
视屏讲解:https://www.bilibili.com/video/av48196406/?p=4 命令行运行Java代码 (1)使用记事本新建文本文件[Test.java]. 注意,默认状态下W ...