题目:http://codeforces.com/problemset/problem/746/F

先感叹一下题目之长!

一些测试样例在后面给出。

题目大意:

Sasha 去工作的路上喜欢听歌,途中经历 K 分钟,有一个歌单,顺序播放。

每首歌都对应一个开心值 ai ,持续时间为 ti 分钟

开始的时候先选定一首歌曲,例如第x首,从这首歌开始顺序播放,终止条件为:歌单播放完或行程到终点了

一首歌可以播放整首或只播放一部分,后者必须播放歌曲的一半时间(取上整)以上才能获得对应的开心值。

播放一部分还有一个曲目数量限制为w,只有w首歌曲支持半曲播放。

问:确定n w  k 的情况下,Sasha能够获取的最大开心值。

思路:

设定两个set 容器,一个存整首曲目,一个存半曲曲目。想要在固定的时间K 之内听更多的歌曲开心值更高,而且必须是连续的曲目,那就要把时间长的尽量折半,把时间短的让出来按整首去听。所以,刚开始都先把歌曲按半曲存,如果半曲列表满了之后,再根据情况选择性弹出,替换。当K 时间用完之后,就从左边开始删歌曲,保证后面遍历完所有的情况,因为,可以从中任何一首歌曲开始听。这样求取过程中产生的最大开心值即可。半曲列表最大容量为w,原来用的加法做,感觉有点复杂,后来改了减法,这个看个人喜好。

代码如下:

 #include<iostream>
#include<cstdio>
#include<set>
using namespace std;
int arr[];
int happy[]; inline long max(long x, long y)
{
return x > y ? x : y;
} int main()
{
long N, W, K;
while (scanf("%ld %ld %ld", &N, &W, &K) != EOF)
{
long result = , RESULT = ;
set<pair<int, int> >S_, S; //分别代表半曲容器和整首容器
for (int i = ; i <= N; ++i)
scanf("%d", happy + i);
for (int i = ; i <= N; ++i)
scanf("%d", arr + i);
int l, r;
l = r = ;
while (r <= N)
{
//right pointer;
while (r <= N)
{
if (W)
{
if (K >= (arr[r] + ) / )
{
K -= (arr[r] + ) / ;
RESULT = max(RESULT, result += happy[r]);
S_.insert(make_pair(arr[r], r));
r++;
W--;
}
else break; //行程结束
}
else //如果w位置已满
{
int tmp = S_.begin()->first;
if (tmp <= arr[r] && K >= (arr[r] + ) / - (tmp + ) / + tmp) //如果当前的比半曲列表中时间最短的花费时间长,替换
{
K -= (arr[r] + ) / - (tmp + ) / + tmp;
RESULT = max(RESULT, result += happy[r]);
auto p = S_.begin();
S.insert(*p);
S_.erase(p);
S_.insert(make_pair(arr[r], r));
r++;
}
else if (tmp > arr[r] && K >= arr[r]) //如果当前的比半曲列表中时间最短的还短,那么就把当前的短歌放入S
{
K -= arr[r];
RESULT = max(RESULT, result += happy[r]);
S.insert(make_pair(arr[r], r));
r++;
}
else break;
}
}
//left pointer; K时间已经满了,从左边开始删除歌曲,以保证继续往后遍历
if (l < r)
{
if (S.find(make_pair(arr[l], l)) != S.end())
{
K += arr[l];
result -= happy[l];
S.erase(make_pair(arr[l], l));
}
else
{
K += (arr[l] + ) / ;
result -= happy[l];
S_.erase(make_pair(arr[l], l));
W++;
if (!S.empty())
{
auto p = --S.end();
K += p->first - (p->first + ) / ;
S_.insert(*p);
W--;
S.erase(p);
}
}
l++;
}
else l++, r++;
}
printf("%d\n", RESULT);
}
}

Sample Input


Sample Output


感谢您的阅读,生活愉快~

Music in Car CF 746F的更多相关文章

  1. ORA-00494: enqueue [CF] held for too long (more than 900 seconds) by 'inst 1, osid 5166'

    凌晨收到同事电话,反馈应用程序访问Oracle数据库时报错,当时现场现象确认: 1. 应用程序访问不了数据库,使用SQL Developer测试发现访问不了数据库.报ORA-12570 TNS:pac ...

  2. cf之路,1,Codeforces Round #345 (Div. 2)

     cf之路,1,Codeforces Round #345 (Div. 2) ps:昨天第一次参加cf比赛,比赛之前为了熟悉下cf比赛题目的难度.所以做了round#345连试试水的深浅.....   ...

  3. cf Round 613

    A.Peter and Snow Blower(计算几何) 给定一个点和一个多边形,求出这个多边形绕这个点旋转一圈后形成的面积.保证这个点不在多边形内. 画个图能明白 这个图形是一个圆环,那么就是这个 ...

  4. ARC下OC对象和CF对象之间的桥接(bridge)

    在开发iOS应用程序时我们有时会用到Core Foundation对象简称CF,例如Core Graphics.Core Text,并且我们可能需要将CF对象和OC对象进行互相转化,我们知道,ARC环 ...

  5. [Recommendation System] 推荐系统之协同过滤(CF)算法详解和实现

    1 集体智慧和协同过滤 1.1 什么是集体智慧(社会计算)? 集体智慧 (Collective Intelligence) 并不是 Web2.0 时代特有的,只是在 Web2.0 时代,大家在 Web ...

  6. CF memsql Start[c]UP 2.0 A

    CF memsql Start[c]UP 2.0 A A. Golden System time limit per test 1 second memory limit per test 256 m ...

  7. CF memsql Start[c]UP 2.0 B

    CF memsql Start[c]UP 2.0 B B. Distributed Join time limit per test 1 second memory limit per test 25 ...

  8. CF #376 (Div. 2) C. dfs

    1.CF #376 (Div. 2)    C. Socks       dfs 2.题意:给袜子上色,使n天左右脚袜子都同样颜色. 3.总结:一开始用链表存图,一直TLE test 6 (1)如果需 ...

  9. CF #375 (Div. 2) D. bfs

    1.CF #375 (Div. 2)  D. Lakes in Berland 2.总结:麻烦的bfs,但其实很水.. 3.题意:n*m的陆地与水泽,水泽在边界表示连通海洋.最后要剩k个湖,总要填掉多 ...

随机推荐

  1. sql 恢复数据库

    RESTORE DATABASE RoadFlowWebForm --数据库名称 FROM DISK = 'E:\WEBFORM2.5.1.bak' --bak文件路径 with replace, M ...

  2. [HAOI2006]旅行 题解(kruskal)

    [HAOI2006]旅行 Description Z小镇是一个景色宜人的地方,吸引来自各地的观光客来此旅游观光.Z小镇附近共有N个景点(编号为1,2,3,-,N),这些景点被M条道路连接着,所有道路都 ...

  3. 【译】第九篇 SQL Server代理了解作业和安全

    本篇文章是SQL Server代理系列的第九篇,详细内容请参考原文 在这一系列的上一篇,学习了如何在SQL Server代理作业步骤启动外部程序.你可以使用过时的ActiveX系统,运行批处理命令脚本 ...

  4. git 放弃本地修改操作

      如果在修改时发现修改错误,而要放弃本地修改时, 一, 未使用 git add 缓存代码时. 可以使用 git checkout -- filepathname (比如: git checkout ...

  5. JS设计模式——6.方法的链式调用

    什么是链式调用 这个很容易理解,例如: $(this).setStyle('color', 'red').show(); 分解链式调用 链式调用其实是两个部分: 1.操作对象(也就是被操作的DOM元素 ...

  6. VM虚拟机上连接usb无反映

    主机的usb连接又是正常的,排除了usb3.0的接口原因后,突然想到了是不是虚拟机的什么服务没有开?进入到控制面板->管理工具->服务,找到 V开头的,发现原来确实是虚拟机有关usb的服务 ...

  7. pywin32记录备忘

    项目地址:http://sourceforge.net/projects/pywin32/ 文档地址:http://docs.activestate.com/activepython/2.7/pywi ...

  8. mybatis模糊查询防止SQL注入

    SQL注入,大家都不陌生,是一种常见的攻击方式.攻击者在界面的表单信息或URL上输入一些奇怪的SQL片段(例如“or ‘1’=’1’”这样的语句),有可能入侵参数检验不足的应用程序.所以,在我们的应用 ...

  9. mysql状态查看 QPS/TPS/缓存命中率查看【转】

    运行中的mysql状态查看   对正在运行的mysql进行监控,其中一个方式就是查看mysql运行状态.    (1)QPS(每秒Query量)  QPS = Questions(or Queries ...

  10. 使用nginx sticky实现基于cookie的负载均衡【转】

    在多台后台服务器的环境下,我们为了确保一个客户只和一台服务器通信,我们势必使用长连接.使用什么方式来实现这种连接呢,常见的有使用nginx自带的ip_hash来做,我想这绝对不是一个好的办法,如果前端 ...