鱼塘钓鱼(fishing)

Source

题目描述

有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。

输出格式

一个整数(不超过2^{31} - 1),表示你的方案能钓到的最多的鱼。

输入样例

5

10 14 20 16 9

2 4 6 5 3

3 5 4 4

14

输出样例

76


#include <bits/stdc++.h>

using namespace std;

int n, lizhiyi[101], chenxian[101], chenyuxiang[101], size, heap[100001], T, hlake[100001];

void put(int x, int lake){
	int i, j, t;
	size++;
	heap[size] = x;
	hlake[size] = lake;
	i = size;
	while(i > 1){
		j = i / 2;
		if(heap[i] <= heap[j]){
			return;
		}
		t = heap[i];
		heap[i] = heap[j];
		heap[j] = t;
		t = hlake[i];
		hlake[i] = hlake[j];
		hlake[j] = t;
		i = j;
	}
}

void Heap(int erw){
	int i = erw;
	int j, t;
	while(i * 2 <= size){
		j = i * 2;
		if(j < size && heap[j + 1] > heap[j]){
			j++;
		}
		if(heap[i] >= heap[j]){
			return;
		}
		t = heap[i];
		heap[i] = heap[j];
		heap[j] = t;
		t = hlake[i];
		hlake[i] = hlake[j];
		hlake[j] = t;
		i = j;
	}
}

int main(){
	int m;
	int p = 0;
	int ans = 0;
	cin >> n;
	for(int i = 1; i <= n; i++){
		cin >> lizhiyi[i];
	}
	for(int i = 1; i <= n; i++){
		cin >> chenxian[i];
	}
	for(int i = 1; i <= n - 1; i++){
		cin >> chenyuxiang[i];
	}
	cin >> m;
	for(int i = 1; i <= n; i++){
		T = m - p;
		int sum = 0;
		int size = 0;
		for(int j = 1; j <= i; j++){
			put(lizhiyi[j], j);
		}
		while(T > 0 && heap[1] > 0){
			sum += heap[1];
			heap[1] -= chenxian[hlake[1]];
			Heap(1);
			T--;
		}
		if(sum > ans){
			ans = sum;
		}
		p += chenyuxiang[i];
	}
	cout << ans;
	return 0;
}