poj1042
题目大意:去捕鱼
约翰去参加一个垂钓旅行,他有h小时可以使用在该地区有n (2 <= n <= 25) 个湖泊可以沿着一个单一的路到达,约翰从湖泊1开始,但是它可以在任何湖泊结束他如果想,他仅仅只可以从一个湖到另一个湖,除非他想否则不会停留在任何湖泊,对于每个i=1,......,n-1,每间隔5分钟,都会从湖i到湖i+1来表示为ti( 0 < ti <=192),例如t3=4,意思就是将会花费20分钟时间从湖3到湖4,帮助约翰完成这次钓鱼旅行,约翰收集了一些关于湖泊的信息,对于每个湖i,在最初的5分钟能捕到鱼的数目,表示为fi(fi>=0),已经知道,每过5分钟钓的鱼的数量都会减少di(di>=0),如果鱼的数量在接下来的时间间隔内小于等于di,在接下来的时间内将没有鱼出现,为了简化问题,约翰认为没有别的人捕鱼影响他捕鱼的数量。
写一个程序帮助约翰可以捕到最多的鱼,在每个湖泊里面花费的时间必须是5的倍数。
用优先队列取每个阶段的最大值
#include<stdio.h>
#include<queue>
using namespace std;
#define maxn 30
struct node
{
int fi, di, index, p;
friend bool operator < (node n1, node n2)
{
if(n1.fi != n2.fi)
return n1.fi < n2.fi;
return n1.index > n2.index;
}
};
void Solve(int ans[], node a[], int n, int *Max, int Time);
int main()
{
int n, t=0;
while(scanf("%d", &n), n)
{
int i, H, Max=-1, ans[maxn]={0}, ti[maxn]={0}, time=0;
node a[maxn];
scanf("%d", &H);
H = H*12;
for(i=0; i<n; i++)
scanf("%d", &a[i].fi);
for(i=0; i<n; i++)
{
scanf("%d", &a[i].di);
a[i].index = i;
a[i].p = 0;
}
for(i=1; i<n; i++)
scanf("%d", &ti[i]);
for(i=0; i<n; i++)
{
time += ti[i];
Solve(ans, a, i+1, &Max, H-time);
}
if(t)printf("\n");t++;
for(i=0; i<n; i++)
printf("%d%s", ans[i]*5, i==n-1?" \n":", ");
printf("Number of fish expected: %d\n", Max);
}
return 0;
}
void Solve(int ans[], node a[], int n, int *Max, int Time)
{
int i, sum=0;
priority_queue<node> Q;
node s;
for(i=0; i<n; i++)
{
s = a[i];
Q.push(s);
}
if(Time < 0)return ;
while(Time)
{
Time--;
s = Q.top(), Q.pop();
sum += s.fi;
s.fi -= s.di, s.p++;
if(s.fi < 0)
s.fi = 0;
Q.push(s);
}
if(*Max < sum)
{
while(Q.size())
{
s = Q.top(), Q.pop();
ans[s.index] = s.p;
}
*Max = sum;
}
#include<queue>
using namespace std;
#define maxn 30
struct node
{
int fi, di, index, p;
friend bool operator < (node n1, node n2)
{
if(n1.fi != n2.fi)
return n1.fi < n2.fi;
return n1.index > n2.index;
}
};
void Solve(int ans[], node a[], int n, int *Max, int Time);
int main()
{
int n, t=0;
while(scanf("%d", &n), n)
{
int i, H, Max=-1, ans[maxn]={0}, ti[maxn]={0}, time=0;
node a[maxn];
scanf("%d", &H);
H = H*12;
for(i=0; i<n; i++)
scanf("%d", &a[i].fi);
for(i=0; i<n; i++)
{
scanf("%d", &a[i].di);
a[i].index = i;
a[i].p = 0;
}
for(i=1; i<n; i++)
scanf("%d", &ti[i]);
for(i=0; i<n; i++)
{
time += ti[i];
Solve(ans, a, i+1, &Max, H-time);
}
if(t)printf("\n");t++;
for(i=0; i<n; i++)
printf("%d%s", ans[i]*5, i==n-1?" \n":", ");
printf("Number of fish expected: %d\n", Max);
}
return 0;
}
void Solve(int ans[], node a[], int n, int *Max, int Time)
{
int i, sum=0;
priority_queue<node> Q;
node s;
for(i=0; i<n; i++)
{
s = a[i];
Q.push(s);
}
if(Time < 0)return ;
while(Time)
{
Time--;
s = Q.top(), Q.pop();
sum += s.fi;
s.fi -= s.di, s.p++;
if(s.fi < 0)
s.fi = 0;
Q.push(s);
}
if(*Max < sum)
{
while(Q.size())
{
s = Q.top(), Q.pop();
ans[s.index] = s.p;
}
*Max = sum;
}
}