题目大意

给出一个歌单(有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;
}

最新文章

  1. apache+mysql+php的环境配置
  2. 矩阵k次幂 采用三重循环
  3. mysql 数值函数
  4. springMVC使用与生成序列号
  5. jQuery1.11源码分析(7)-----jQuery一些基本的API
  6. 【leetcode❤python】169. Majority Element
  7. apache2: Could not reliably determine the server&#39;s fully qualified domain name
  8. 基于RBAC模型的通用企业权限管理系统
  9. asp.net实现md5加密方法详解
  10. 高级Bash脚本编程指南
  11. selenium.common.exceptions.TimeoutException: Message: Screenshot: available via screen
  12. 程序员使用Node的十个技巧
  13. 第五章 Spring3.0 、Hibernate3.3与Struts2的整合 基于Annotation
  14. uva 10271 Chopsticks(dp)
  15. Hadoop-2.2.0中国文献—— Web应用代理
  16. 基于protobuf的RPC实现
  17. Oracle数据泵(上)
  18. hadoop记录-如何换namenode机器
  19. Spring MVC 5 + Thymeleaf 基于Java配置和注解配置
  20. MySQL8.0 关闭二进制日志

热门文章

  1. 第一次发干货Observable.zip与Observable.forkJoin
  2. JQuery实现子级选择器
  3. 基于Select模型通信程序的编写,编译和执行
  4. 【CodeBase】PHP打印所有用户自定义常量
  5. php集成开发环境xampp的搭建
  6. php-5.6.26源代码 - opcode列表
  7. CentOS yum命令报错 Error: File /var/cache/yum/i386/6/epel/metalink.xml does not exist
  8. python——matplotlib图像的基本处理
  9. Android 时间计算工具 通用类TimeUtil
  10. python面向对象的反射