题目描述

话说发源于小朋友精心设计的游戏被电脑组的童鞋们藐杀之后非常不爽,为了表示安慰和鼓励,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. 【Linux】Devops的一些运维工具

    一.Devops简介 从手工编译.上传服务器文件.执行命令.启动停止服务器.发现BUG再重复一遍流程,软件开发的重复劳动越来越多,在Devops概念之前,全部要靠人工手动完成,也看到了很多运维人员半夜 ...

  2. go系列(1)- linux下安装go环境

    安装GO 打开安装包下载地址,查看linux下go的最新版本 https://golang.google.cn/dl/ 经查看go的最新版本为go1.11.4.linux-amd64.tar.gz 右 ...

  3. 【bzoj3033】太鼓达人

    3033: 太鼓达人 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 521  Solved: 399[Submit][Status][Discuss] ...

  4. 牛客寒假6-A.出题

    链接:https://ac.nowcoder.com/acm/contest/332/A 题意: 小B准备出模拟赛. 她把题目按难度分为四等,分值分别为6,7,8,9. 已知小B共出了m道题,共n分. ...

  5. LOJ6212(博弈论)

    n <= L 和 n <= 2L 情况显然,一次就能取完: 分析 n > 2L 时: Alice手速太快,Bob同学是弱势群体,所以Bob肯定不能单纯地模仿Alice,那样顶多是平手 ...

  6. [洛谷P1434] [SHOI2007]滑雪

    题目链接: here we go 题外话: 谁能想到这是一道咕了两年的\(AC\)呢--当年是在搜索还半懂不懂的时候遇到的这道题,感觉真是难得要命()所以一直拖着不做,后面就下意识地逃避了搜索相关的内 ...

  7. jQuery制作一个多彩下拉菜单按钮

    最终效果图: html代码: <div id="list"> <div id="btn"> <div class="ic ...

  8. Linux 安装gcc4.8版本

    1.下载安装包 http://ftp.tsukuba.wide.ad.jp/software/gcc/releases/gcc-4.8.1/ 2.解压 .tar.gz 3.下载编译所需的依赖包 cd ...

  9. c# 实现窗体移动

    一般情况下: .添加下列代码到你的窗体中: #region 轻松移动 bool isInMove; Point oldPoint; void InitializeEasyMove() { isInMo ...

  10. AJPFX关于线程创建的方式

    创建线程的第一种方式:继承Thread ,由子类复写run方法. 步骤: 1,定义类继承Thread类: 2,目的是复写run方法,将要让线程运行的代码都存储到run方法中: 3,通过创建Thread ...