Codeforces Round #386 (Div. 2) 746F(set的运用)
题目大意
给出一个歌单(有n首歌),每个歌都有愉悦值和时间,你可以选择从第x首歌开始听(也就是选择连续的一段),并且你可以选择w首歌让它的时间减半,限制时间为k,求最大的愉悦值
首先我们需要贪心一下,假如从第x首歌开始听,那么要想获得最大的愉悦值,就必须把那些时间最长的歌进行减半处理。
根据这个,我们就需要利用数据结构来进行维护
考虑使用两个set来维护,S1中保存没有被减半的歌曲,S2中保存减半了的歌曲
首先从x=1开始听,每新加进来一首歌i,进行如下处理
1、S2中还没有w首歌,就直接放进S2里
2、S2中已经有了w首歌,那么就抽出其中时间最短的歌与i比较,如果i的时间大,就把那个最短的歌放到S1中,把i放到S2中;否则就把i放到S1中
假如无法放入歌曲,那么就统计出来当前的愉悦值,然后把第一首歌删掉
删除时要注意,如果删掉的元素在S1中就不需要额外处理,如果在S2中,就要把S1中最长的歌再放到S2中
然后直到最后一首歌被抽出,输出最大的答案
每首歌只会被放入或抽出1次,所以复杂度是nlogn
#include <iostream>
#include <cstdio>
#include <set>
using namespace std;
const int maxn = *;
struct Data
{
int t, id;
Data() {}
Data(int _t, int _id) { t = _t; id = _id; }
bool operator <(const Data& B) const
{ return (t == B.t) ? (id < B.id) : t < B.t; }
bool operator == (const Data& B) const
{ return t == B.t && id == B.id; }
};
struct node
{
int t, v;
}a[maxn];
set<Data> S1, S2;
int nowt = , tot = -, st = ;
void Insert(int ty, int t, int id)
{
if(ty == )
{
S1.insert(Data(t, id));
nowt += t;
} else
{
S2.insert(Data(t, id));
nowt += ((t-)/+);
}
} void Erase(int ty, int t, int id)
{
if(ty == )
{
S1.erase(Data(t, id));
nowt -= t;
} else
{
S2.erase(Data(t, id));
nowt -= ((t-)/+);
}
} void ERASE(int st)
{
if(S1.find(Data(a[st].t, st)) != S1.end()) Erase(, a[st].t, st);
else
{
Erase(, a[st].t, st);
if(S1.size() > )
{
Data tmp = *(--S1.end());
Erase(, tmp.t, tmp.id);
Insert(, tmp.t, tmp.id);
}
}
} int n, w, k;
int main()
{
cin>>n>>w>>k;
for(int i = ; i < n; i++) cin>>a[i].v;
for(int i = ; i < n; i++) cin>>a[i].t;
int ans = , ANS = ;
while(st != n)
{
while(nowt <= k)
{
tot++;
if(tot >= n) break;
if(S2.size() < w)
{
Insert(, a[tot].t, tot);
}
else
{
Data tmp = *S2.begin();
if(tmp.t < a[tot].t)
{
Erase(, tmp.t, tmp.id);
Insert(, tmp.t, tmp.id);
Insert(, a[tot].t, tot);
} else
Insert(, a[tot].t, tot);
}
if(nowt <= k) ans += a[tot].v;
else
{
ERASE(tot);
tot--;
break;
}
ANS = max(ANS, ans);
}
ERASE(st);
ans -= a[st].v;
st++;
}
cout<<ANS<<endl;
}
Codeforces Round #386 (Div. 2) 746F(set的运用)的更多相关文章
- Codeforces Round #386 (Div. 2)
迟到的一次比赛 最近状态很崩溃 网速很慢 然后前面五题看了都有打 但是 只有A B E 是过了的 是时候要反省一下 A.随便判断一下就好 最少的份数嘛 B.画出来之后是一下子左边一下子右边 打一个递归 ...
- Codeforces Round #386 (Div. 2) C. Tram
C. Tram time limit per test 1 second memory limit per test 256 megabytes input standard input output ...
- Codeforces Round #386 (Div. 2) C D E G
一场比较简单的题 比较脑洞 C 如果坐车比较快的话 先走不如等车 所以最后的ans是min(纯走路,纯坐车) 讨论一下坐车时间 D 因为k一定是>=1的 所以当a=b的时候 GBGBGB这样间隔 ...
- Codeforces Round #386 (Div. 2) 746G(树的构造)
大体题意 一棵树有n个结点,告诉你每层深度上有a[i]个结点,以及有多少叶子结点 让你生成这棵树 题解:考虑一颗树,如果满足每层深度上有a[i]结点,最多能有多少叶子结点 那么答案很简单,就是对(a[ ...
- Codeforces Round #386 (Div. 2) A+B+C+D!
A. Compote 水题(数据范围小都是水题),按照比例找最小的就行了,3min水过. int main() { int a,b,c; while(~scanf("%d%d%d" ...
- Codeforces Round #386 (Div. 2)G. New Roads [构造][树]
题目链接:G. New Roads 题意:给出n个结点,t层深度,每层有a[i]个结点,总共有k个叶子结点,构造一棵树. 分析: 考虑一颗树,如果满足每层深度上有a[i]结点,最多能有多少叶子结点 那 ...
- Codeforces Round #366 (Div. 2) ABC
Codeforces Round #366 (Div. 2) A I hate that I love that I hate it水题 #I hate that I love that I hate ...
- Codeforces Round #354 (Div. 2) ABCD
Codeforces Round #354 (Div. 2) Problems # Name A Nicholas and Permutation standard input/out ...
- Codeforces Round #368 (Div. 2)
直达–>Codeforces Round #368 (Div. 2) A Brain’s Photos 给你一个NxM的矩阵,一个字母代表一种颜色,如果有”C”,”M”,”Y”三种中任意一种就输 ...
随机推荐
- jQuery、Angluar、Avalon对比
最近在慕课网看一些关于avalon的视频,记录下一些笔记及代码实例以便日后自己复习可以用到,另外也可以给不想花时间看视频的小伙伴提供一丝丝帮助 这里主要是做一个简单的todolist 分别用三种不同的 ...
- C/C++程序基础 (十)模板和泛型
什么是泛型编程 基于模板,有效将算法和数据结构分离. 模板 包括类型和参数 模板函数:抽象的函数定义,代表一类同构函数.编译器在其调用位置自动完成对应模板函数的实例化. 模板类:抽象的类定义,代表更高 ...
- dubbo 与Spring Cloud 对比
链接:https://www.zhihu.com/question/45413135/answer/242224410 近期也看到一些分享Spring Cloud的相关实施经验,这对于最近正在整理Sp ...
- ofbiz最新版13.07.01环境搭建、安装(linux环境下)
一.软件必备: 1.jdk1.7 2.mysql5.6 3.安装tomcat 二.安装: 1.安装 JDK1.7 2.安装mysql数据库 3.下载apache-ofbiz-13.07.01.zip ...
- JavaScript 事件机制
1 什么是事件 JavaScript 使我们有能力创建动态页面.事件是可以被 JavaScript 侦测到的行为. 网页中的每个元素都可以产生某些可以触发 JavaScript 函数的事件.比方说,我 ...
- xml中Node和Element的区别
本文转载自:http://blog.csdn.net/wcydiyi/article/details/4432636点击打开链接 1.元素(Element)和结点(Node)的区别: ...
- PHP提取奇数或偶数下标元素
该功能主要用到 array_filter() 函数,这个函数可以用回调函数过滤数组中的单元.用法: array array_filter ( array $array [, callable $cal ...
- vue.js实践应用
对于vue.js,不想多比比,直接搞上源码+图片 <!DOCTYPE html> <html> <head> <meta charset="utf- ...
- 开始体验第一个JAVA程序吧!
一.准备工作(配置环境) 1.安装JAVA开发工具(JDK) a.下载符合自己电脑系统的Java开发软件:http://www.oracle.com/technetwork/java/javase/d ...
- DFS:C 小Y的难题(1)
解题心得: 1.在明确使用DFS之后一定要找到递归函数的出口.方向,以及递归的点(在某个情况下开始递归)(void 也可以return,但是没有返回值).递归时也要有递归的方向,最后都能够达到递归的出 ...