每日一题 day46 打卡

Analysis

首先通过题目我们不难发现,为了得到最优解,那么就不能把时间浪费在路上,也就是说不能走回头路。然后很容易可以发现,在每个时刻在不同的鱼塘钓到的鱼的数量是不同的,为了保证钓到最多的鱼,那么我们每次钓都要选当前可以钓到鱼数量最多的鱼塘,钓完之后就更新这个鱼塘的钓鱼数量,再进行下一轮的钓鱼。

那么现在就出现一个问题:如果要想按照上面的贪心方法,每次到可以钓到鱼的数量最多的鱼塘里去钓鱼,那么就很可能出现要在几个鱼塘之间来来去去,会把时间浪费在路上。

怎样解决这个问题呢?

我们可以先确定可以走到的最远的鱼塘i,然后把时间减去从鱼塘1走到鱼塘i的时间,在剩下的时间里一直钓鱼,可以假设钓鱼人可以瞬间移动,在鱼塘1到鱼塘i之间采用上面的贪心方法,就可以求到最远走到鱼塘i的最优解。

为什么可以假设钓鱼人可以瞬间移动呢?

因为钓鱼人的钓鱼的范围是从鱼塘1到鱼塘i,所以他花的最少的移动时间就是从鱼塘1到鱼塘i的时间,那么剩下来的时间就可以全部用来钓鱼,那么这时我们要考虑的并不是钓鱼的次序,而是钓了哪几次鱼,也就是说,我们只要知道每次钓的鱼是在哪里钓的就行了,并不要知道从鱼塘1出发之后的钓鱼过程,而上面提到的贪心算法,恰恰求的就是每次钓的鱼是在哪里钓的。

解决了这个问题,那么还有一个问题:在实现贪心算法的时候,如何每次快速找到目前钓鱼数量最多的鱼塘并且实时更新鱼塘的钓鱼数量呢?

常规的话,就是要全部扫一遍,找到最大值,然后更新就更为麻烦,不可取。这时,就想到一种很高效的求最值的数据结构——优先队列。我们可以用一个优先队列,来储存当前可以钓到的鱼塘钓鱼数量,只要维护一个大根堆,就可以很容易地实现得到最大值和更新。

我们最后来总结一下贪心+优先队列的方法,我们以5分钟为一个单位时间,穷举所有可以到达的最远鱼塘,每次都用总时间减去花在路上的时间,也就是从鱼塘1到目前最远鱼塘的距离,就得到钓鱼的时间,然后就用贪心来求到当前情况下的最优解,贪心时取最大值和更新用优先队列来实现,最后在所有的最优解中选取一个最大的就得到最终答案。

 #include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
#define int long long
#define maxn 100+10
#define INF 2147483647
#define rep(i,s,e) for(register int i=s;i<=e;++i)
#define dwn(i,s,e) for(register int i=s;i>=e;++i)
using namespace std;
inline int read()
{
int x=,f=;
char c=getchar();
while(c<''||c>'') {if(c=='-') f=-; c=getchar();}
while(c>=''&&c<='') {x=x*+c-''; c=getchar();}
return f*x;
}
inline void write(int x)
{
if(x<) {putchar('-'); x=-x;}
if(x>) write(x/);
putchar
(x%+'');
}
int n,h,ans=;
struct node
{
int init,reduce,time;
}x[maxn];
priority_queue<pair<int,int> > q;
signed main()
{
n=read();
h=read();
h*=;
rep(i,,n) x[i].init=read();
rep(i,,n) x[i].reduce=read();
rep(i,,n-) x[i].time=read();
rep(i,,n)
{
while(!q.empty()) q.pop();
int re=h,red=,sit=;
rep(j,,i)
{
q.push(make_pair(x[j].init,j));
if(j!=i) red+=x[j].time;
}
re-=red;
if(re<=){ans=max(ans,sit); continue;}
while(re--)
{
int top=q.top().first,num=q.top().second;
q.pop();
sit+=top;
if(top-x[num].reduce<) q.push(make_pair(,num));
else q.push(make_pair(top-x[num].reduce,num));
}
ans=max(ans,sit);
}
write(ans);
return ;
}

请各位大佬斧正(反正我不认识斧正是什么意思)

最新文章

  1. Eclipse 实用技巧
  2. mysql select日期格式
  3. SMARTY模板中如何使用get,post,request,cookies,session,server变量
  4. Introduction of OpenCascade Foundation Classes
  5. Git学习笔记(9)——自定义配置
  6. 面向对象的 JavaScript
  7. Log Parser 微软强大的日志分析工具
  8. 检查string是否为double
  9. 如何让IIS 8.0支持无后缀图片的访问
  10. 推荐书目 - C++学习资料
  11. [转载]Reids配置文件详解
  12. C#的常见算法(面试)
  13. Django 2.0 Release note阅读简记
  14. Maven修改默认JDK
  15. 你还有没有印象?腾讯QQ16个版本界面你认识多少?
  16. Monit安装与配置
  17. 【转载】html中object标签详解
  18. programming-languages学习笔记--第9部分
  19. 02 Architecture Overview
  20. Tr&#230;fɪk 服务发现解决方案

热门文章

  1. 深度学习-CNN+RNN笔记
  2. 解决docker容器中Centos7系统的中文乱码
  3. LOJ2001 SDOI2017 树点涂色 LCT、线段树
  4. yii框架中的下拉菜单和单选框
  5. 爬虫多次爬取时候cookie的存储用于登入
  6. 手写MQ框架(二)-服务端实现
  7. java static变量及函数
  8. linux上安装redis-单机版
  9. SpringBoot2.x服务器端主动推送技术
  10. Mybatis环境搭建:自学随笔