鱼塘钓鱼(fishing)(信息学奥赛一本通 1373)
【问题描述】
有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)的更多相关文章
- T1373:鱼塘钓鱼(fishing)
原题链接:1373:鱼塘钓鱼(fishing) 解题思路: 由于在走路时,鱼的数量不会减少,那我们此时可以先减去路上可能花掉的时间,用剩下的时间来找最多的鱼,然后从左向右走,k枚举能到达的最远的鱼塘, ...
- $ybt\ 【信息学奥赛一本通】题解目录$
[信息学奥赛一本通]题解目录 $ \large -> OJ$ $ problem1000 $ \(Answer\) - > $ \large 1000$ $ problem1001 $ \ ...
- 2019寒假练题计划——LibreOJ刷题计划 &《信息学奥赛一本通》提高版题目
目录 2019.1.27 #10082. 「一本通 3.3 例 1」Word Rings 题意 思路 #10083. 「一本通 3.3 例 2」双调路径 题意 思路 #10084. 「一本通 3.3 ...
- 【信息学奥赛一本通】第三部分_队列 ex2_3produce 产生数
给出一个整数n(n<=2000)(代码可适用n<=10^31)和k个变换规则(k<=15). 规则:1.1个数字可以变换成另1个数字: 2.规则中右边的数字不能为零. BFS #in ...
- 信息学奥赛一本通算法(C++版)基础算法:高精度计算
高精度加法(大位相加) #include <bits/stdc++.h> using namespace std; int main() { ],b1[]; ],b[],c[];//a,b ...
- 食物链【NOI2001】(信息学奥赛一本通 1390)
[题目描述] 动物王国中有三类动物A,B,C,这三类动物的食物链构成了有趣的环形.A吃B, B吃C,C吃A. 现有N个动物,以1-N编号.每个动物都是A,B,C中的一种,但是我们并不知道它到底是哪一种 ...
- Biorhythms(信息学奥赛一本通 1639)
题目描述: 人生来就有三个生理周期,分别为体力.感情和智力周期,它们的周期长度为23天.28天和33天.每一个周期中有一天是高峰.在高峰这天,人会在相应的方面表现出色.例如,智力周期的高峰,人会思维敏 ...
- 信息学奥赛一本通 提高篇 序列第k个数 及 快速幂
我是传送门 这个题首先是先判断是等差还是等比数列 等差的话非常简单: 前后两个数是等差的,举个栗子: 3 6 9 12 这几个数,(我感觉 1 2 3 4并说明不了什么) 每次都加3嘛,很容易看出,第 ...
- 【NOI2002】荒岛野人(信息学奥赛一本通 1637)(洛谷 2421)
题目描述 克里特岛以野人群居而著称.岛上有排列成环行的M个山洞.这些山洞顺时针编号为1,2,…,M.岛上住着N个野人,一开始依次住在山洞C1,C2,…,CN中,以后每年,第i个野人会沿顺时针向前走Pi ...
随机推荐
- Java知识回顾 (18)Java 8、9、11的新特性
Java 8 Java 8 (又称为 jdk 1.8) 是 Java 语言开发的一个主要版本. Oracle 公司于 2014 年 3 月 18 日发布 Java 8 ,它支持函数式编程,新的 Jav ...
- 深入理解es6(上)
一.let和const 1.let与var的区别 不存在变量提升 块级作用域 不允许重复声明 2.const常量 const与let一样,唯一区别在于声明的常量不能被修改 二.解构赋值 es6按照一定 ...
- Java利用POI实现导入导出Excel表格示例代码
转自:https://www.jb51.net/article/95526.htm 介绍 Jakarta POI 是一套用于访问微软格式文档的Java API.Jakarta POI有很多组件组成,其 ...
- Gradle 使用教程之 Task 详解
最近打算学习下 gradle 在 Android 中的使用,结果百度出来的文章都是介绍性文章,没啥干货.后来找到 gradle 官网教程,自己对着撸. Gradle 概述: Gradle 是一个基于 ...
- 【Flask】 python学习第一章 - 6.0 WTF表单 数据库 蓝图
WTF表单 wtf.py pip install flask-wtf # 安装 from flask_wtf import FlaskForm from wtform import StringF ...
- Windows Cmd 命令管理服务
今天在Windows 干净环境上安装软件过程中,安装完成后,发现部署在IIS 上的网站无法使用,提示 "您提交的参数有误!,请重新提交" 纯净的windows 7 x64位环境, ...
- CVE-2019-5475:Nexus2 yum插件RCE漏洞复现
0x00 前言 如果有想一起做漏洞复现的小伙伴,欢迎加入我们,公众号内点击联系作者即可 提示:由于某些原因,公众号内部分工具即将移除,如果有需要的请尽快保存 0x01 漏洞概述 最近hackerone ...
- UPUPW和ThinkPHP安装配置
去年弄过,今年弄起来就简单多了. 参考的是<ThinkPHP实战>
- 2019年牛客多校第一场 E题 ABBA DP
题目链接 传送门 思路 首先我们知道\('A'\)在放了\(n\)个位置里面是没有约束的,\('B'\)在放了\(m\)个位置里面也是没有约束的,其他情况见下面情况讨论. \(dp[i][j]\)表示 ...
- 【转】RabbitMQ三种Exchange模式
[转]RabbitMQ三种Exchange模式 RabbitMQ中,所有生产者提交的消息都由Exchange来接受,然后Exchange按照特定的策略转发到Queue进行存储 RabbitMQ提供了四 ...
