题目描述

话说发源于小朋友精心设计的游戏被电脑组的童鞋们藐杀之后非常不爽,为了表示安慰和鼓励,VIP999决定请他吃一次“年年大丰收”,为了表示诚意,他还决定亲自去钓鱼,但是,因为还要准备2013NOIP,z老师只给了他H(1<=H<=16)个小时的空余时间,假设有N(2<=n<=25)个鱼塘都在一条水平路边,从左边到右编号为1、2、3、。。。、n)。VIP是个很讲究效率的孩子,他希望用这些时间钓到尽量多的鱼。他从湖1出发,向右走,有选择的在一些湖边停留一定的时间钓鱼,最后在某一个湖边结束钓鱼。他测出从第I个湖到I+1个湖需要走5*ti分钟的路,还测出在第I个湖边停留,第一个5分钟可以钓到鱼fi,以后再每钓5分钟鱼,鱼量减少di。为了简化问题,他假定没有其他人钓鱼,也不会有其他因素影响他钓到期望数量的鱼。请编程求出能钓最多鱼的数量。

输入输出格式

输入格式:
第一行:湖的数量n。 第二行:时间h(小时)。 第三行:n个数,f1,f2,…fn。 第四行:n个数,d1,d2,….dn。 第五行:n-1个数,t1,t2,….tn-1 输出格式:
一个数,所能钓鱼的最大数量。 输入输出样例 输入样例#1: 复制
2
1
10 1
2 5
2
输出样例#1: 复制
31

昨天想到的写法是,在右边的池塘钓鱼后返回左边钓到的鱼就等价于从左边到达右边,则路上耗时的最小值就是t[最远到达的点]*5,再用合并果子的思想每次取出最大的一个,减去d[堆顶元素]再重新维护一次堆。

只能过样例,也想通为什么了。

极限思想:假设很远很远的地方有一个最大的鱼塘,而很近的地方有一个比它略小但是仍然很大的鱼塘,显然跑到后面钓鱼不合适,废。

正解是用枚举构造条件(最远到达点)辅助堆进行选择,n次选择后就可以了。

几个细节是

  1. 关于堆中元素的序号,可以用一个数组ids存,维护堆的时候顺便swap了ids

    2. 在维护堆的时候,break条件应该或一个(hp[next] == hp[now]&&d[next]>d[now]),因为当两个鱼塘都有一样的鱼时(在枚举的范围内),显然应该选择减少较慢的鱼塘。

第二个不加也行,本质上先钓哪个都一样

堆的应用!

#include<iostream>
#define MAXN 2000
using namespace std; int n,h,oh; int f[MAXN],d[MAXN],t[MAXN]; int ids[MAXN];
int hp[MAXN];
int size,mxsz; int ans,mx; void reb(int x) {
int now=x,next;
while(now<<1<=mxsz) {
next=now<<1;
if(next<mxsz&&hp[next] <hp[next+1] ) next++;
if(hp[next] <hp[now] ||(hp[next] == hp[now]&&d[next]==d[now]) ) break;
swap(hp[next],hp[now]);
swap(ids[next],ids[now]);
now=next;
}
} int main() {
cin>>n>>oh;
oh*=60;
int i;
for(i=1; i<=n; i++) cin>>f[i];
for(i=1; i<=n; i++) cin>>d[i];
for(i=2; i<=n; i++) cin>>t[i],t[i]+=t[i-1]; for(i=1; i<=n; i++) {
h=oh;
for(int j=1; j<=i; j++) {
hp[j]=f[j];
ids[j]=j;
}
mxsz=i;
for(int j=1; j<=i>>1; j++) reb(j);
ans=0;
while(h-5-5*t[i]>=0) {//5*!
h-=5;
ans+=hp[1];
hp[1]-=d[ids[1]];
reb(1);
if(hp[1]<=0) break;
}
mx=max(mx,ans);
}
cout<<mx<<endl;
return 0;
}

[LUOGU] 1717 钓鱼的更多相关文章

  1. P1717 钓鱼 洛谷

    https://www.luogu.org/problem/show?pid=1717 题目描述 话说发源于小朋友精心设计的游戏被电脑组的童鞋们藐杀之后非常不爽,为了表示安慰和鼓励,VIP999决定请 ...

  2. luogu 2312 解方程 乱搞+取模

    思路非常好想,但是你很难想到去用这个算法,因为这个几乎就是个乱搞~ 我们发现多项式中每一个系数都很大,但是 $m$ 却很小,即最多只用 $10^6$ 个整数需要验证. 我们知道,如果一个数等于 $0$ ...

  3. 【社工】NodeJS 应用仓库钓鱼

    前言 城堡总是从内部攻破的.再强大的系统,也得通过人来控制.如果将入侵直接从人这个环节发起,那么再坚固的防线,也都成为摆设. 下面分享一个例子,利用应用仓库,渗透到开发人员的系统中. 应用仓库 应用仓 ...

  4. 【技巧】使用weeman来做一个钓鱼网页

    本文来自网友836834283 对玄魂工作室的投稿. 工具项目地址:https://github.com/Hypsurus/weeman/ 克隆地址:https://github.com/Hypsur ...

  5. BZOJ 1717: [Usaco2006 Dec]Milk Patterns 产奶的模式 [后缀数组]

    1717: [Usaco2006 Dec]Milk Patterns 产奶的模式 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 1017  Solved: ...

  6. Luogu 魔法学院杯-第二弹(萌新的第一法blog)

    虽然有点久远  还是放一下吧. 传送门:https://www.luogu.org/contest/show?tid=754 第一题  沉迷游戏,伤感情 #include <queue> ...

  7. SOJ 1717 Computer (单机任务调度)

    一.题目描述 Constraints :Time Limit: 2 secs, Memory Limit: 32 MB Description: We often hear that computer ...

  8. luogu p1268 树的重量——构造,真正考验编程能力

    题目链接:http://www.luogu.org/problem/show?pid=1268#sub -------- 这道题费了我不少心思= =其实思路和标称毫无差别,但是由于不习惯ACM风格的题 ...

  9. 初试钓鱼工具Weeman+DNS欺骗的使用

    下午无聊再网上闲逛随意看了下,自己做了一次测试,目前最新的版本是1.6.Weeman是一款运行在Python环境下的钓鱼渗透测试工具 但这款工具简单易用,安装简单,可伪造HTML页面等等...网上看了 ...

随机推荐

  1. python 之 函数 基础

    为什么要有函数?什么是函数? 1.组织结构不清晰,可读性差 2.代码冗余 3.管理维护的难度极大,扩展性 具备某一个功能的工具就是程序的中函数 ​ 事先准备工具的过程---->函数的定义 ​ 拿 ...

  2. random 库

    random 是使用随机数的python 标准库 ——为随机数:采用梅森旋转算法生成的(伪)随机序列中的元素 —— import random 基本随机数函数:seed(),random() 扩展随机 ...

  3. python异常之EOFError: Ran out of input

    出现该问题一般是由于你在以写模式打开文件后未关闭的情况下又去以读模式操作该文件时报的错误 # coding = utf-8 import pickle #定义一个boy类 class boy(): d ...

  4. CF #541div2 D

    题目本质:形成一个拓扑图,不应带自环. 解决方法: 1.先把等于号的部分用dsu缩点: 2.大于和小于号建立拓扑关系: 3.n*m的矩阵,只要用标号n+j代表m集合的第j个就从二维降到一维了: 4.d ...

  5. linux资源性能指标

    1.cpu Running:正在运行的进程 Waiting:已准备就绪,等待运行的进程 Blocked:因为等待某些事件完成而阻塞的进程,通常在等待I/O  命令获取数据: vmstat 1其中: u ...

  6. python学习之TCP/UDP

    TCP/UDP都是网络编程(socket)的两种基于C/S结构的程序. UDP的9999端口与TCP的9999端口可以各自绑定. UDP:非可靠连接速度快,服务器:创建socket 绑定ip和端口后直 ...

  7. aspectj xml

    1.接口和类 1.1 ISomeService 接口 public interface ISomeService { public void doSome(); public void dade(); ...

  8. maven创建springMVC项目(一)

    1.Eclipse配置 添加maven集成安装包:路径是maven下载安装的解压位置,如果不知道如何下载安装请点击这里看我的另一篇安装文章,这里不多说 这里需要注意的是: a.settings.xml ...

  9. let和const注意点

    let 一.块级作用域 下面的代码如果使用var,最后输出的是10. var a = []; for (var i = 0; i < 10; i++) { a[i] = function () ...

  10. C# for循环的嵌套 作用域

    for() {   循环体可以套无数个for循环 } 比如:for() { for() { for() {... ...这里面可以镶嵌无数个for循环} } } 也可以这样 for() { for() ...