题目描述

话说发源于小朋友精心设计的游戏被电脑组的童鞋们藐杀之后非常不爽,为了表示安慰和鼓励,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. web前端篇:html基础知识

    目录 1.web前端: 2.HTML概述 2.1HTML介绍 2.2HTML在计算机中如何表现 3.HTML基础语法 4.练习题: 1.web前端: 什么是web? web 就是网页,是一种基于B/S ...

  2. 多线程:『GCD』详尽总结

    本文用来介绍 iOS 多线程中 GCD 的相关知识以及使用方法.这大概是史上最详细.清晰的关于 GCD 的详细讲解+总结的文章了.通过本文,您将了解到:1. GCD 简介2. GCD 任务和队列3. ...

  3. Linux之文本处理命令

    Sort 将文件的每一行作为一个单位,相互比较,比较原则是从首字符向后,依次按ASCII码值进行比较,最后将他们按升序输出. -u     在输出行中去除重复行 -r      改为降序(默认升序) ...

  4. csu 1551: Longest Increasing Subsequence Again BIT + 思维

    预处理last[i]表示以第i个开始,的合法后缀. pre[i]表示以第i个结尾,的合法前缀. 那么每一个数a[i],肯定是一个合法后缀last[i] + 一个合法前缀,那么合法前缀的数字要小于a[i ...

  5. 1047 - Best couple 好题~

    http://www.ifrog.cc/acm/problem/1047 思路很简单,跑一发floyd,然后再用km. 但是问题来了,这个有可能n != m.那怎么办? 其实可以补上一些不存在的点.来 ...

  6. Dubbo理论知识

    本文是作者根据官方文档以及自己平时的使用情况,对 Dubbo 所做的一个总结.如果不懂 Dubbo 的使用的话,可以参考我的这篇文章<超详细,新手都能看懂 !使用SpringBoot+Dubbo ...

  7. hdu2475Box(splay树形转线性)

    链接 推荐一篇帖子 http://blog.csdn.net/lyhypacm/article/details/6734748 这题暴力不可行主要是因为这颗树可能极度不平衡,不能用并查集是不能路径压缩 ...

  8. PL/SQL 多表关联UPDATE

    假设有两个表A和B,A表字段a,b,c,d,B表字段b,e,f,两表的关联条件是字段b,现在想做个data patch,欲将B表中的字段e的值patch给A表的字段c. 有如下两种方法: 1 upda ...

  9. m_pConnection.CreateInstance( "ADODB.Connection ") 执行错误 结果总是为NULL

    今天下午搞了下项目 数据库操作模块,总是出现m_pConnection.CreateInstance( "ADODB.Connection ") 执行错误,即m_pConnecti ...

  10. Opencv内存jpg图像解码和编码[转]

    CV_IMPL CvMat* cvEncodeImage( const char* ext,const CvArr* arr, const int* _params ) CV_IMPL IplImag ...