田园将芜胡不归?既自以心为形役,奚惆怅而独悲?悟已往之不谏,知来者之可追。实迷途其未远,觉今是而昨非。

题目链接http://codeforces.com/contest/746/problem/F

cf div2 386,稍微纪念一下,终于变为blue,然而还是2道题的水平!先说一下这次的大体情况吧!这次是什么比赛的同步,一般这个比赛的题目都比较水,就像这次一样,拿下4,5题不是问题!然而普通的div2,就没有这么好的条件了,真是冲分的好机会!这次做了4题,都是读完题,就有思路,稍微思考一下边界条件,然后码代码就可以了!然后,d题怎么也过不去,后来分析是没有仔细思考,一是枚举的方式不太好,二是这种的边界不好处理!然后就去码e题,居然一次就过了,但是后怕system test会挂,后来听说这题的checker有问题,算是水过了!然后再看了看d题,就没时间了!f题和g题,都没有看!

后来看了下f和g题,g题跟以前的一道题目很相似,然后画了画简单例子,码完就过了。f题实在没什么思路!

这里写一下看完f题的想法,或者是为什么无从下手的原因,或者是什么困惑:

1. 数据范围很大,n=2e5,k=1e9,如果考虑用dp的话,这个数据范围不行啊,考虑dp的原因是:因为不知道那些歌曲该取半,哪些不该取半!

2. 看完官方题解和讨论后,感觉上面的考虑就是扯淡,根本一点关联也没有!

原因是:a. 听的歌曲可以从任意位置开始

b. k时间内听得歌曲都必须听,不能跳过(而这点就限制了,解题思路不能往dp方向考虑,而是区间)

c. 最关键的是:这里固定区间,使得收益最大,(每首歌曲的收益都是正数,没有负数和0,而且听的时间减半也不会对收益造成影响),那么收益最大就是听尽可能多的歌曲,那么,很容易得出结论,(这个题目的限制条件,取半的歌曲的数目上限为w),寻找区间,使得区间内听歌时间最大的w个的歌曲取半,这样得到的是这个区间的最大收益值,这样结果很明确,不容考虑各种组合,不需要枚举,不需要dp,(反正这里也不能dp),最优的也就那么一种。

d. 最终的答案就是遍历所有可能这样区间即可,固定左边界,右边界是非递减的,这就可以使用two pointer来做!

3. 接下来就是码代码,知道思想以后,还有一条鸿沟,就是考虑使用什么数据结构,ac了才是王道。

4. 一开始看题,是在想不明白这题的tag是data structure,现在恍然大悟。

5. 思路里面还有一个小细节,删除的时候需要考虑的,这题还是有一定难度的。质量很高!

这里贴一个别人的代码:写的很清晰,简单,漂亮!

 /* Author haleyk10198 */
/* �@��: haleyk10198 */
#include <bits/stdc++.h> #define MOD 1000000007
#define LINF (1LL<<60)
#define INF 2147483647
#define PI 3.1415926535897932384626433
#define ll long long
#define pii pair<int,int>
#define mp(x,y) make_pair((x),(y)) using namespace std; string itos(int x){
stringstream ss;
ss<<x;
return ss.str();
} int n, m, k, a[], b[], tt, res, now; set<pii> h1, h2; int main(){
//freopen("input.txt","r",stdin);
//freopen("output.txt","w",stdout);
ios_base::sync_with_stdio(false);
cin >> n >> m >> k;
for(int i = ; i < n; i++)
cin >> a[i];
for(int i = ; i < n; i++)
cin >> b[i];
for(int l = , r = ; r < n; ){
while(tt <= k && r < n){
if(h1.size() < m){
h1.insert(mp(b[r], r));
tt += (b[r] + ) / ;
}
else if(h1.begin()->first < b[r]){
tt -= (h1.begin()->first + ) / ;
tt += h1.begin()->first;
tt += (b[r] + ) / ;
h2.insert(*h1.begin());
h1.erase(*h1.begin());
h1.insert(mp(b[r], r));
}
else{
h2.insert(mp(b[r], r));
tt += b[r];
}
now += a[r++];
if(tt <= k)
res = max(res, now);
}
while(tt > k){
if(h1.count(mp(b[l], l))){
tt -= (b[l] + ) / ;
h1.erase(mp(b[l], l));
if(!h2.empty()){
auto x = *h2.rbegin();
tt -= x.first;
tt += (x.first + ) / ;
h1.insert(x);
h2.erase(x);
}
}
else{
tt -= b[l];
h2.erase(mp(b[l], l));
}
now -= a[l++];
if(tt <= k)
res = max(res, now);
}
}
cout << res << endl;
return ;
}

F. Music in Car的更多相关文章

  1. Mysql_以案例为基准之查询

    查询数据操作

  2. 在 C# 里使用 F# 的 option 变量

    在使用 C# 与 F# 混合编程的时候(通常是使用 C# 实现 GUI,F#负责数据处理),经常会遇到要判断一个 option 是 None 还是 Some.虽然 Option module 里有 i ...

  3. 如果你也会C#,那不妨了解下F#(7):面向对象编程之继承、接口和泛型

    前言 面向对象三大基本特性:封装.继承.多态.上一篇中介绍了类的定义,下面就了解下F#中继承和多态的使用吧.

  4. 如果你也会C#,那不妨了解下F#(2):数值运算和流程控制语法

    本文链接:http://www.cnblogs.com/hjklin/p/fs-for-cs-dev-2.html 一些废话 一门语言火不火,与语言本身并没太大关系,主要看语言的推广. 推广得好,用的 ...

  5. 使用F#开发ASP.NET Core应用程序

    .NET Core 里的F# 在.NET Core刚发布时,就已经添加了对F#的支持.但因为当时F#组件还不完整,而一些依赖包并没有放在Nuget上,而是社区自己放到MyGet上,所以在使用dotne ...

  6. 如果你也会C#,那不妨了解下F#(6):面向对象编程之“类”

    前言 面向对象的思想已经非常成熟,而使用C#的程序员对面向对象也是非常熟悉,所以我就不对面向对象进行介绍了,在这篇文章中将只会介绍面向对象在F#中的使用. F#是支持面向对象的函数式编程语言,所以你用 ...

  7. 如果你也会C#,那不妨了解下F#(5):模块、与C#互相调用

    F# 项目 在之前的几篇文章介绍的代码都在交互窗口(fsi.exe)里运行,但平常开发的软件程序可能含有大类类型和函数定义,代码不可能都在一个文件里.下面我们来看VS里提供的F#项目模板. F#项目模 ...

  8. 如果你也会C#,那不妨了解下F#(4):了解函数及常用函数

    函数式编程其实就是按照数学上的函数运算思想来实现计算机上的运算.虽然我们不需要深入了解数学函数的知识,但应该清楚函数式编程的基础是来自于数学. 例如数学函数\(f(x) = x^2+x\),并没有指定 ...

  9. 如果你也会C#,那不妨了解下F#(3):F#集合类型和其他核心类型

    本文链接:http://www.cnblogs.com/hjklin/p/fs-for-cs-dev-3.html 在第一篇中,我们介绍了一些基础数据类型,其实那篇标题中不应该含有"F#&q ...

  10. 如果你也会C#,那不妨了解下F#(1):F# 数据类型

    本文链接:http://www.cnblogs.com/hjklin/p/fs-for-cs-dev-1.html 简单介绍 F#(与C#一样,念作"F Sharp")是一种基于. ...

随机推荐

  1. php 换行 空格分割处理

    <?php function parse_specification($specification){ $rt=array(); $lines=array_filter(preg_split(& ...

  2. XMPP协议、IM、客户端互联详解

    导读 对于推送,IM服务器,目前可以使用一些厂家提供的SDK来实现,但是我们的老板又总是担心使用别人的SDK,假如别人的服务出现问题,或者别人偷看咱们的信息,那岂不是出现很大问题了 聊一聊xmpp的服 ...

  3. Is an MTD device a block device or a char device?

    转:http://www.linux-mtd.infradead.org/faq/general.html#L_mtd_what Note, you can find Ukranian transla ...

  4. 关于Android(Java)创建匿名线程

    Java中创建匿名线程主要集中就三中方式:Thread,Runnable,Handler去实现,下面分别介绍之- 一.通过Thread来创建 new Thread() { public void ru ...

  5. iOS一分钟学会环形进度条

    有几篇博客写到了怎么实现环形进度条,大多是使用Core Graph来实现,实现比较麻烦且效率略低,只是一个小小的进度条而已,我们当然是用最简单而且效率高的方式来实现.先看一下这篇博客,博客地址:htt ...

  6. sort() 方法用于对数组的元素进行排序

    语法 arrayObject.sort(sortby) 参数 描述 sortby 可选.规定排序顺序.必须是函数. 返回值 对数组的引用.请注意,数组在原数组上进行排序,不生成副本. 说明 如果调用该 ...

  7. oracle数据库常用SQL语句

    1)删除表的一列 ALTER TABLE 表名 DROP COLUMN 列名; 2)增加表的一列 且默认值为0 alter table 表名 add 字段名 类型 default '0'; 3)修改表 ...

  8. WPF之复杂形状控件

    有的时候想将一张图片变成一个按钮.当然这里不是单纯讲图片作为按钮的背景. 这两者是有区别的: 前者图片即按钮,比如你有一个空心的圆圈,当你点击中间空心部分的时候是没有任何反应的因为它不是属于按钮的一部 ...

  9. Android&iOS崩溃堆栈上报

    Android&iOS崩溃堆栈上报 原文地址:http://www.cnblogs.com/songcf/p/4885468.html 通过崩溃捕获和收集,可以收集到已发布应用(游戏)的异常, ...

  10. nodejs(一) 简单登录验证 使用mongoose 操作MongoDB

    ---恢复内容开始--- 开发使用webstorm 9  新建nodejs+express 项目 newfarmer 文章目录 配置Mongoose 创建目录及文件 插入数据,POST提交JSON增加 ...