/*
一,用枚举加优先队列的话,要注意以下一些地方,(搞的重写,才解决的)
a, 注意,当总钓鱼数为0时,所有时间,放到第一个湖中;
b, 可以把题目中DISCUSS 里的一些先人尝试过的数进行测试;总比自己去想测试数据要好一些;
*/
#include <iostream>
#include <fstream>
#include <cstring>
#include <cmath>
#include <queue>
using namespace std;
int n,h,H, res, Sres;
typedef struct node{
int f,d,t,id;
friend bool operator < (const node a, const node b){
if(a.f == b.f){
return a.id > b.id;
}
return a.f<b.f;
}
} node;
priority_queue<node> que;
int f[30], f2[30], d[30], d2[30], t[30], t2[30];
int isEnd(int k){
for(int i=1; i<=k; ++i){
if(f[i] > 0){
return 1;
}
}
return 0;
}
int main(){
// freopen("a.txt", "r", stdin);
while(scanf("%d", &n) && n) {
scanf("%d", &H);
//输入开始
for(int i=1; i<=n; ++i){
scanf("%d", &f[i]);
f2[i] = f[i];
}
for(int i=1; i<=n; ++i){
scanf("%d", &d[i]);
d2[i] = d[i];
}
for(int i=1; i<n; ++i){
scanf("%d", &t[i]);
t2[i] = t[i];
}
//输入结束
//开始处理数据
node node1;
Sres = 0;
for(int k=1; k<=n; ++k){
while(!que.empty()) que.pop();
for(int i=1; i<=k; ++i){
f[i] = f2[i];
}
h = H*60;
res = 0;
for(int i=1; i<=k; ++i){
node1.id = i;
node1.f = f[i];
node1.d = d[i];
node1.t = 0;
que.push(node1);
}
for(int i=1; i<k; ++i){
h -= t[i]*5;
}
while(h>0 && isEnd(k)){
node1 = que.top(); que.pop();
res += node1.f;
node1.f -= node1.d;
++node1.t;
f[node1.id] -= d[node1.id];
h = h - 5;
que.push(node1);
}
if(Sres < res){
Sres = res;
while(!que.empty()){
node1 = que.top(); que.pop();
t2[node1.id] = node1.t*5;
}
for(int i=k+1; i<=n; ++i){
t2[i] = 0;
}
if(h>0){
t2[1] += h;
}
}
}
if(Sres == 0){
t2[1] = H*60;
for(int i=2; i<=n; ++i){
t2[i] = 0;
}
}
for(int i=1; i<=n; ++i){
printf("%d", t2[i]);
if(i+1 <= n) {
printf(", ");
}
}
printf("\n");
printf("Number of fish expected: %d\n\n", Sres);
}
return 0;
}
POJ 1042(枚举 + 优先队列)(好像比DP要快点)
猜你喜欢
转载自blog.csdn.net/julicliy/article/details/79599873
今日推荐
周排行