【问题描述】

有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. c#利用定时器自动备份数据库(mysql)

    1:引用dll MySql.Data.dll,   MySqlbackup.dll 2:建一个数据连接静态类 public static class mysql{public static strin ...

  2. 浅谈有趣的 //go: 指令

    前言 如果你平时有翻看源码的习惯,你肯定会发现.咦,怎么有的方法上面总是写着 //go: 这类指令呢.他们到底是干嘛用的? 今天我们一同揭开他们的面纱,我将简单给你介绍一下,它们都负责些什么 go:l ...

  3. Golang中的RegExp正则表达式用法指南

    ------------------------------------------------------------ Golang中的正则表达式 ------------------------- ...

  4. ASP.NET MVC 页面静态化操作的思路

    本文主要讲述了在asp.net mvc中,页面静态化的几种思路和方法.对于网站来说,生成纯html静态页面除了有利于seo外,还可以减轻网站的负载能力和提高网站性能.在asp.net mvc中,视图的 ...

  5. 线程并发工具类之CountDownLatch的使用及原理分析

    原文链接:http://www.studyshare.cn/blog/details/1149/1 java开发工具下载地址及安装教程大全,点这里.更多技术文章,在这里. 一.定义 CountDown ...

  6. Windows上安装ElasticSearch7

    安装JDK1.8(包括)以上版本 安装ElasticSearch ElasticSearch下载地址: https://www.elastic.co/downloads/elasticsearch 双 ...

  7. WPF应用打包流程

    1,安装工程模板插件Microsoft Visual Studio Installer Projects https://marketplace.visualstudio.com/items?item ...

  8. MavenWrapper替代Maven

    1. 说明 jdk8已经安装成功 Maven已经安装成功 参见Maven Wrapper 2. Maven初始化项目 注:初次执行,Maven会下载很多jar,需等待几分钟 mvn archetype ...

  9. CASE WHEN 函数

    --Case函数: --有两种格式: -- 1.简单Case函数. -- 2.Case搜索函数. --1.简单Case函数: -- CASE [COLUMN_NAME] -- WHEN ['条件参数' ...

  10. Synchronized偏向锁和轻量级锁的升级

    原文:https://blog.csdn.net/tongdanping/article/details/79647337 锁的优化1.锁升级锁的4中状态:无锁状态.偏向锁状态.轻量级锁状态.重量级锁 ...