【问题描述】

有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. flask 与 SQLAlchemy的使用

    flask 与 SQLAlchemy的使用 安装模块 pip install flask-sqlalchemy 在单个python中与flask使用 # 文件名:manage.py from flas ...

  2. 【转载】 C#中List集合使用OrderByDescending方法对集合进行倒序排序

    在C#的List集合操作中,有时候需要针对List集合进行排序操作,如果是对List集合按照元素对象或者元素对象的某个属性进行倒序排序的话,可以使用OrderByDescending方法来实现,Ord ...

  3. DB2数据库中DB2字符串类型

    DB2字符串是DB2数据库中的基础知识,下面就为您分类介绍DB2字符串,供您参考,如果您对DB2字符串方面刚兴趣的话,不妨一看. DB2字符串是字节序列.DB2字符串包括 CHAR(n) 类型的定长字 ...

  4. Flask项目初始化

    数据库实现命令初始化 1.实现命令主脚本 # coding=utf-8 from functools import wraps from getpass import getpass import s ...

  5. idea之将Maven的jar包安装到本地仓库

    1.问题概要 很多时候,我们需要应用第三方的jar包,但是这个jar包,在maven远程仓库里面没有, 比如我们要使用京东的sdk,但这个sdk在maven的远程仓库中没有,于是我们需要将这个jar包 ...

  6. 大数据之kafka-02.搞定kafka专业术语

    02.搞定kafka专业术语 在kafka的世界中有很多概念和术语是需要我们提前理解并且熟练掌握的,下面来盘点一下. 之前我们提到过,kafka属于分布式的消息引擎系统,主要功能是提供一套完善的消息发 ...

  7. Linux命令——getfacl、setfacl

    简介 ACL是Access Control List的缩写,传统的Linux权限只能针对一个用户.一个群组及非此群组的其他人设置权限而已,无法针对单一用户或个人来设计权限.ACL可以对权限进行更细致的 ...

  8. C语言基础知识-数组和字符串

    C语言基础知识-数组和字符串 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.数组概述 在程序设计中,为了方便处理数据把具有相同类型的若干变量按有序形式组织起来的方式我们称为数组 ...

  9. windows10访问ftp中文乱码怎么办?

    windows10访问ftp中文乱码怎么办? 打开控制面板 选择时间和区域 选择更改数字格式 点击管理并点击更改系统区域设置 打勾

  10. 史上最完整promise源码手写实现

    史上最完整的promise源码实现,哈哈,之所以用这个标题,是因为开始用的标题<手写promise源码>不被收录 promise自我介绍 promise : "君子一诺千金,承诺 ...