鱼塘钓鱼(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 ...
随机推荐
- int转换为String,常用的四种方法。
int i = 100; 方法一:String s1 = i + " "; 方法二:String s2 = String.valueof(i); 方法三(先转换为Integer类型 ...
- 安装VMware14可能出现的问题
未能提取文件 安装程序未能提取安装vmware workstation所必须的文件 在没有关闭这个弹框的前提下,Win+R输入%temp%,找到以~setup结尾的文件夹,双击下面的临时文件VMwar ...
- vue插件(还真是第一次接触)
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...
- 图解HTTP(一)
第一章 了解Web及网络基础 1.为知识共享为规划Web,基本理念是:借助多文档之间相互关联(你中有我,我中有你)形成的超文本,连成客户想参阅的WWW(World Wide Web). 2.提出了3项 ...
- Android Studio 打包生成apk
打开AndroidStudio,并且打开想要生成apk文件的项目 点击工具栏上面的“Builder” 点击“Builder”之后在下拉菜单里面可以看到“Genarate Singed APK”,点 ...
- 140款Android开源优秀项目源码
BeautifulRefreshLayout-漂亮的美食下拉刷新 https://github.com/android-cjj/BeautifulRefreshLayout/tree/Beautifu ...
- MySQL MHA工作原理
MHA工作组件 MHA(Master High Availability)是一种MySQL高可用解决方案,由日本DeNA公司开发,主要用于在故障切换和主从提升时进行快速切换,并最大程度保证数据一致性. ...
- session和cookie的区别和联系详解,Cookie Session相关看这篇就够了。
本文转自:91博客:原文地址:http://www.9191boke.com/199015867.html 有一朋友做面试官的时候,曾经问过很多朋友这个问题: Cookie 和 Session 有什么 ...
- MySQL/MariaDB数据库的MHA实现高可用实战
MySQL/MariaDB数据库的MHA实现高可用实战 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.MySQL高可用常见的解决方案 1>.Multi-Master ...
- HTML&CSS基础-meta标签
HTML&CSS基础-meta标签 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.常见字符集 1>ASCII 我们知道计算机是由外国人发明的,他们当时也没有考虑到 ...