Description
n个池塘,从第i到第i+1个池塘需要5*t[i]分钟,第i个池塘第一次捕鱼可以捕到f[i]条鱼,之后每五分钟减少d[i]条(如果池塘中鱼的数量已经小于d[i]则减少到0条),起点在第1个池塘,问h小时内最多可以捕多少鱼
Input
第一行一整数T表示用例组数,每组用例输入两个整数n和h表示池塘数量和时限,之后n个整数f[i]表示初始状态第i个池塘第一次捕鱼可以捕到的鱼的数量,之后n个整数d[i]表示每5分钟第i个池塘可捕到鱼的数量减少值,最后n-1个整数t[i]表示第i个池塘到第i+1个池塘用时为5*t[i]分钟(T<=100,2<=n<=25,1<=h<=16,0<=f[i],d[i]<=1000,0 < t[i] < 192)
Output
输出最多可以捕到多少条鱼以及在第i个池塘花了多长时间捕鱼,如果有多种方案则输出在编号较小池塘捕鱼数较多的方案
Sample Input
3
2 1
10 1
2 5
2
4 4
10 15 20 17
0 3 4 3
1 2 3
4 4
10 15 50 30
0 3 4 3
1 2 3
Sample Output
Case 1:
45, 5
Number of fish expected: 31
Case 2:
240, 0, 0, 0
Number of fish expected: 480
Case 3:
115, 10, 50, 35
Number of fish expected: 724
Solution
贪心,枚举最终走到第i个池塘,先把在路上花的时间扣掉,之后贪心的从前i个池塘中选取鱼数量最多的去捕更新最优解即可
Code
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<vector>
#include<queue>
#include<map>
#include<set>
#include<ctime>
using namespace std;
typedef long long ll;
#define INF 0x3f3f3f3f
#define maxn 33
int Case=1,T,n,h,f[maxn],d[maxn],t[maxn],a[maxn],b[maxn],c[maxn],ans;
int main()
{
scanf("%d",&T);
while(T--)
{
scanf("%d%d",&n,&h);
h*=12;
for(int i=1;i<=n;i++)scanf("%d",&f[i]);
for(int i=1;i<=n;i++)scanf("%d",&d[i]);
t[1]=0;
for(int i=2;i<=n;i++)scanf("%d",&t[i]);
ans=0;
memset(a,0,sizeof(a));
for(int i=1;i<=n;i++)
{
if(t[i]>h)break;
h-=t[i];
int temp=0;
for(int j=1;j<=i;j++)c[j]=f[j];
memset(b,0,sizeof(b));
for(int j=1;j<=h;j++)
{
int pos=1;
for(int k=2;k<=i;k++)
if(c[k]>c[pos])pos=k;
//if(c[pos]==0)break;
b[pos]+=5,temp+=c[pos],c[pos]=max(c[pos]-d[pos],0);
}
if(temp>ans)
{
ans=temp;
for(int j=1;j<=i;j++)a[j]=b[j];
}
}
printf("Case %d:\n",Case++);
for(int i=1;i<n;i++)printf("%d, ",a[i]);
printf("%d\n",a[n]);
printf("Number of fish expected: %d\n",ans);
}
return 0;
}