[LUOGU] 1717 钓鱼
题目描述
话说发源于小朋友精心设计的游戏被电脑组的童鞋们藐杀之后非常不爽,为了表示安慰和鼓励,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次选择后就可以了。
几个细节是
- 关于堆中元素的序号,可以用一个数组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 钓鱼的更多相关文章
- P1717 钓鱼 洛谷
https://www.luogu.org/problem/show?pid=1717 题目描述 话说发源于小朋友精心设计的游戏被电脑组的童鞋们藐杀之后非常不爽,为了表示安慰和鼓励,VIP999决定请 ...
- luogu 2312 解方程 乱搞+取模
思路非常好想,但是你很难想到去用这个算法,因为这个几乎就是个乱搞~ 我们发现多项式中每一个系数都很大,但是 $m$ 却很小,即最多只用 $10^6$ 个整数需要验证. 我们知道,如果一个数等于 $0$ ...
- 【社工】NodeJS 应用仓库钓鱼
前言 城堡总是从内部攻破的.再强大的系统,也得通过人来控制.如果将入侵直接从人这个环节发起,那么再坚固的防线,也都成为摆设. 下面分享一个例子,利用应用仓库,渗透到开发人员的系统中. 应用仓库 应用仓 ...
- 【技巧】使用weeman来做一个钓鱼网页
本文来自网友836834283 对玄魂工作室的投稿. 工具项目地址:https://github.com/Hypsurus/weeman/ 克隆地址:https://github.com/Hypsur ...
- BZOJ 1717: [Usaco2006 Dec]Milk Patterns 产奶的模式 [后缀数组]
1717: [Usaco2006 Dec]Milk Patterns 产奶的模式 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 1017 Solved: ...
- Luogu 魔法学院杯-第二弹(萌新的第一法blog)
虽然有点久远 还是放一下吧. 传送门:https://www.luogu.org/contest/show?tid=754 第一题 沉迷游戏,伤感情 #include <queue> ...
- SOJ 1717 Computer (单机任务调度)
一.题目描述 Constraints :Time Limit: 2 secs, Memory Limit: 32 MB Description: We often hear that computer ...
- luogu p1268 树的重量——构造,真正考验编程能力
题目链接:http://www.luogu.org/problem/show?pid=1268#sub -------- 这道题费了我不少心思= =其实思路和标称毫无差别,但是由于不习惯ACM风格的题 ...
- 初试钓鱼工具Weeman+DNS欺骗的使用
下午无聊再网上闲逛随意看了下,自己做了一次测试,目前最新的版本是1.6.Weeman是一款运行在Python环境下的钓鱼渗透测试工具 但这款工具简单易用,安装简单,可伪造HTML页面等等...网上看了 ...
随机推荐
- cdq(2018.10.18)
一句话题意:给你三个数列{a_i},{b_i},{c_i},保证每个数列都恰好是一个排列.你需要求出满足\(a_i<a_j,b_i<b_j,c_i<c_j\)的有序对\((i,j)\ ...
- kojs select绑值(工作)
<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <tit ...
- UWP 版本号
一:版本号 个人开发者对于版本号的命名相对随便一点,如果是大公司的话,命名则要规范一点.以开发UWP为例 在创建包的时候,开发者可以自定义版本号或者点击自动增加. 二:对应上图中的四个格子中的数字 第 ...
- Elasticsearch之安装
elasticsearch需要java8以上支持 java -version 二进制文件下载 www.elastic.co/downloads tar安装示例 1.下载tar文件 curl -L -O ...
- C51存储的优化
我们知道51单片机只有128BYTE的RAM, 有的增强型有XRAM,此时编程时就要注意,否则就有可能超出空间 1 对于各模块的全局变量.静态变量.全局枚举型常量,静态枚举型常量.个别操作存储(如外部 ...
- phpdesigner 配置SVN
- shell脚本解析json文件
安装jq扩展 下载:jq 根据自己系统下载对应的文件 cp jq-linux64 /usr/bin cd /usr/bin mv jq-linux64 jq chmod +x jq 使用方法 假设有个 ...
- P1202 [USACO1.1]黑色星期五Friday the Thirteenth
题目描述 13号又是一个星期五.13号在星期五比在其他日子少吗?为了回答这个问题,写一个程序,要求计算每个月的十三号落在周一到周日的次数.给出N年的一个周期,要求计算1900年1月1日至1900+N- ...
- I/O————字符流和流的关闭
Reader字符输入流 Writer字符输出流 用于字符的形式读取和写入数据 FileReader与FileWriter分别是Reader与Writer的子类 public class CharScr ...
- AJPFX关于Collection接口的总结
###15Collection-List-ArrayList/LinkedList/* * Collection接口中的方法* A:添加功能* boolean add ...