【问题描述】

有N个鱼塘排成一排(N<100),每个鱼塘中有一定数量的鱼,例如:N=5时,如下表:

即:在第1个鱼塘中钓鱼第1分钟内可钓到10条鱼,第2分钟内只能钓到8条鱼,……,第5分钟以后再也钓不到鱼了。从第1个鱼塘到第2个鱼塘需要3分钟,从第2个鱼塘到第3个鱼塘需要5分钟,……

【编程任务】   

给出一个截止时间T(T<1000),设计一个钓鱼方案,从第1个鱼塘出发,希望能钓到最多的鱼。   假设能钓到鱼的数量仅和已钓鱼的次数有关,且每次钓鱼的时间都是整数分钟。

【输入格式】   

输入文件共5行,分别表示:   

第1行为N;   

第2行为第1分钟各个鱼塘能钓到的鱼的数量,每个数据之间用一空格隔开;   

第3行为每过1分钟各个鱼塘钓鱼数的减少量,每个数据之间用一空格隔开;   

第4行为当前鱼塘到下一个相邻鱼塘需要的时间;   

第5行为截止时间T;

【输出格式】   

输出文件仅一个整数(不超过231-1),表示你的方案能钓到的最多的鱼。

【输入样例】

5 10 14 20 16 9 2 4 6 5 3 3 5 4 4 14

【输出样例】    

76


【解法一】暴力

(读入优化后居然真的可以过!!!好水的数据啊)

【解法二】

建立以fish为关键字的大根堆,包括能钓到鱼的数量和池塘的编号。然后借助枚举创造条件,实现复杂度为O(m*nlogn)的算法。

#include <iostream>
#include <cstdio>
using namespace std;
struct Data
{
int fish, lake; //堆中结点的信息
};
Data heap[];
int t[], f[], d[];
int Max, k, t1;
void maintain(int i) //维护堆
{
Data a;
int next;
a = heap[i];
next = i * ;
while(next <= k)
{
if(next < k && heap[next].fish < heap[next + ].fish)
next++;
if(a.fish < heap[next].fish)
{
heap[i] = heap[next];
i = next;
next *= ;
}
else break;
}
heap[i] = a;
}
void work()
{
int i, j, m, n;
cin >> n;
for(i = ; i <= n ; i++) cin >> f[i];
for(i = ; i <= n ; i++) cin >> d[i];
for(i = ; i < n ; i++) cin >> t[i];
cin >> m;
for(k = ; k <= n ; k++) //枚举最远走到的池塘的编号
{
int Time = m - t1; //计算剩余时间
int ans = ;
for(i = ; i <= k ; i++) //收集能够钓鱼的池塘的资料
{
heap[i].fish = f[i];
heap[i].lake = i;
}
for(i = ; i <= k / ; i++) maintain(i); //堆的初始化
while(Time > && heap[].fish > )
{
ans += heap[].fish; //贪心选取鱼最多的池塘
heap[].fish -= d[heap[].lake]; //修改鱼的数量
maintain(); //堆维护
Time--; //剩余时间变少
}
if(ans > Max) Max = ans; //刷新最优解
t1 += t[k]; //累计走路需要的时间
}
cout << Max << endl;
} int main()
{
work();
return ;
}

使用STL的版本:

#include <iostream>
#include <cstdio>
#include <queue>
#define fish first
#define lake second
using namespace std;
priority_queue <pair<int, int> > heap;
int t[], f[], d[];
int ans, m, Max, n, k, t1, Time;
void work()
{
int i, j;
cin >> n;
for(i = ; i <= n ; i++) cin >> f[i];
for(i = ; i <= n ; i++) cin >> d[i];
for(i = ; i < n ; i++) cin >> t[i];
cin >> m;
for(k = ; k <= n ; k++) //枚举最远走到的池塘的编号
{
Time = m - t1; //计算剩余时间
ans = ;
for(i = ; i <= k ; i++) //收集能够钓鱼的池塘的资料
heap.push(make_pair(f[i], i)); while(Time > && heap.top().fish > )
{
pair<int, int> a = heap.top();
heap.pop();
ans += a.fish; //贪心选取鱼最多的池塘
a.fish -= d[a.lake]; //修改鱼的数量
heap.push(a); //堆维护
Time--; //剩余时间变少
}
if(ans > Max) Max = ans; //刷新最优解
t1 += t[k]; //累计走路需要的时间
}
cout << Max << endl;
} int main()
{
work();
return ;
}

鱼塘钓鱼(fishing)(信息学奥赛一本通 1373)的更多相关文章

  1. T1373:鱼塘钓鱼(fishing)

    原题链接:1373:鱼塘钓鱼(fishing) 解题思路: 由于在走路时,鱼的数量不会减少,那我们此时可以先减去路上可能花掉的时间,用剩下的时间来找最多的鱼,然后从左向右走,k枚举能到达的最远的鱼塘, ...

  2. $ybt\ 【信息学奥赛一本通】题解目录$

    [信息学奥赛一本通]题解目录 $ \large -> OJ$ $ problem1000 $ \(Answer\) - > $ \large 1000$ $ problem1001 $ \ ...

  3. 2019寒假练题计划——LibreOJ刷题计划 &《信息学奥赛一本通》提高版题目

    目录 2019.1.27 #10082. 「一本通 3.3 例 1」Word Rings 题意 思路 #10083. 「一本通 3.3 例 2」双调路径 题意 思路 #10084. 「一本通 3.3 ...

  4. 【信息学奥赛一本通】第三部分_队列 ex2_3produce 产生数

    给出一个整数n(n<=2000)(代码可适用n<=10^31)和k个变换规则(k<=15). 规则:1.1个数字可以变换成另1个数字: 2.规则中右边的数字不能为零. BFS #in ...

  5. 信息学奥赛一本通算法(C++版)基础算法:高精度计算

    高精度加法(大位相加) #include <bits/stdc++.h> using namespace std; int main() { ],b1[]; ],b[],c[];//a,b ...

  6. 食物链【NOI2001】(信息学奥赛一本通 1390)

    [题目描述] 动物王国中有三类动物A,B,C,这三类动物的食物链构成了有趣的环形.A吃B, B吃C,C吃A. 现有N个动物,以1-N编号.每个动物都是A,B,C中的一种,但是我们并不知道它到底是哪一种 ...

  7. Biorhythms(信息学奥赛一本通 1639)

    题目描述: 人生来就有三个生理周期,分别为体力.感情和智力周期,它们的周期长度为23天.28天和33天.每一个周期中有一天是高峰.在高峰这天,人会在相应的方面表现出色.例如,智力周期的高峰,人会思维敏 ...

  8. 信息学奥赛一本通 提高篇 序列第k个数 及 快速幂

    我是传送门 这个题首先是先判断是等差还是等比数列 等差的话非常简单: 前后两个数是等差的,举个栗子: 3 6 9 12 这几个数,(我感觉 1 2 3 4并说明不了什么) 每次都加3嘛,很容易看出,第 ...

  9. 【NOI2002】荒岛野人(信息学奥赛一本通 1637)(洛谷 2421)

    题目描述 克里特岛以野人群居而著称.岛上有排列成环行的M个山洞.这些山洞顺时针编号为1,2,…,M.岛上住着N个野人,一开始依次住在山洞C1,C2,…,CN中,以后每年,第i个野人会沿顺时针向前走Pi ...

随机推荐

  1. python抓取贝壳房源信息

    分析了贝壳的房源信息数据,发现地址链接的参数传递是有规律的 https://tj.ke.com/chengjiao/a3l4/ a3 实际表示的 l4 表示的是 然后 将复合条件拼成一个字符串,带过去 ...

  2. 05、MySQL—字符集

    1.字符编码概念 字符(Character)是各种文字和符号的总称,包括各国家文字.标点符号.图形符号.数字等. 在计算机中所看到的任何内容都是字符构成的. 字符编码(character code)是 ...

  3. Elasticsearch 主要监控指标 -- 描述了es监控的几个维度,相当不错!

    转发自:https://blog.csdn.net/majianxiong_lzu/article/details/90437559 主要指标梳理 Cluster Health – Nodes and ...

  4. 原生JavaScript遮罩

    /* 适用原生JS */ function showInfo(info) {     var zzInfo = info;     var mask_bg = document.createEleme ...

  5. 一些常用的 Emoji 符号(可直接复制)

    表情类

  6. java-检查IP和端口在超时时间内是否可以连接

    检查IP和端口在超时时间内是否可以连接 /** * 检查IP和端口是否可以连接 * @param ip * @param port * @return */ private static boolea ...

  7. restframework中根据请求的类型修改序列化类

    只要在视图中重写get_serializer_class方法就可以,用if对请求的类型进行判断 def get_serializer_class(self): if self.action == &q ...

  8. idea2018.3导入grails项目,无法正常使用问题解决

    注:作者的grails版本为2.0.4,grails3版本以上的导入方式为gradle方式 一.导入grails项目 1.启动新项目向导.如果IntelliJ IDEA目前没有打开任何项目,请在欢迎屏 ...

  9. 电脑 DNS纪要

    电脑 DNS说明 1.电脑的DNS必须设置成114.114.114.114才能上网? 电脑的DNS不是必须设置成114.114.114.114才能上网,而只是DNS设置为这个地址刚好能够上网.设置合适 ...

  10. 谈谈OAuth1,OAuth2异同

    ##一.写在前面在收集资料时,我查询和学习了许多介绍OAuth的文章,这些文章有好有坏,但大多是从个例出发.因此我想从官方文档出发,结合在stackoverflow上的一些讨论,一并整理一下.整理的内 ...