题意:参考点击打开链接
#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
using namespace std;
const int MAXN = 35;
int h,n;
int ans[MAXN],tmp[MAXN];
struct Node
{
int no;
int rate;
int down;
int time;
friend bool operator < (const Node &a,const Node &b)
{
if (a.rate != b.rate)
return a.rate < b.rate;
return a.no > b.no;
}
}arr[MAXN];
priority_queue<Node>que;
void greedy()
{
int maxsum = -11111;
for (int i = 0; i < n; i++)
{
while (!que.empty())
que.pop();
for (int j = 0; j <= i; j++)
que.push(arr[j]);
int leftTime = h * 60 - arr[i].time,sum = 0;
memset(tmp,0,sizeof(tmp));
while (leftTime > 0)
{
Node temp = que.top();
que.pop();
if (temp.rate <= 0)
break;
sum += temp.rate;
temp.rate -= temp.down;
tmp[temp.no] += 5;
que.push(temp);
leftTime -= 5;
}
if (leftTime > 0)
tmp[0] += leftTime;
if (sum > maxsum)
{
maxsum = sum;
for (int j = 0; j < n; j++)
ans[j] = tmp[j];
}
}
printf("%d",ans[0]);
for (int i = 1; i < n; i++)
printf(", %d",ans[i]);
printf("\n");
printf("Number of fish expected: %d\n",maxsum);
}
int main()
{
bool flag = false;
while (scanf("%d",&n) != EOF && n)
{
scanf("%d",&h);
for (int i = 0; i < n; i++)
{
scanf("%d",&arr[i].rate);
arr[i].no = i;
}
for (int i = 0; i < n; i++)
scanf("%d",&arr[i].down);
arr[0].time = 0;
for (int i = 1; i < n; i++)
{
int t;
scanf("%d",&t);
arr[i].time = arr[i-1].time + t * 5;
}
if (flag)
printf("\n");
else flag = true;
greedy();
}
return 0;
}