http://poj.org/problem?id=1042
题意:N个池塘在一条直线上,每个池塘有个初始收益和递减收益,求H小时内能获得的最大收益。
Idea:
很经典的一个枚举+贪心的题目了。
先枚举走到第k个池塘停止,这样问题就转化为->前K个池塘在剩余时间内的最大收益。然后贪心。
#include <cstdio>
#include <iostream>
#include <fstream>
#include <cstring>
#include <string>
#include <vector>
using namespace std;
int main()
{
freopen("test.txt","r",stdin);
int N,H;
while (~scanf("%d%d",&N,&H)&&N)
{
static int val[30],d[30],t[30],total[30],f[30];
for (int i = 1; i <= N; i++) scanf("%d",&f[i]);
for (int i = 1; i <= N; i++) scanf("%d",&d[i]);
memset(total,0,sizeof(total));
for (int i = 1; i <= N-1; i++)
{
scanf("%d",&t[i]);
total[i] = total[i-1] + t[i];
}
int maxa = -1;
int ans[30],suma = 0;
for (int k = 1; k <= N; k++)
{
copy(f,f+N+1,val);
int h = H*60 - total[k-1]*5;
if (h < 0) break;
static int tans[30];
memset(tans,0,sizeof(tans));
int tmaxa = 0;
while (h >= 5)
{
int maxv = val[1],m = 1;
for (int i = 2; i <= k; i++)
{
if (val[i] > maxv)
{
maxv = val[i];
m = i;
}
}
tans[m] += 5;
h -= 5;
tmaxa += val[m];
val[m] = val[m] - d[m] > 0?val[m] - d[m]:0;
}
if (tmaxa > maxa)
{
maxa = tmaxa;
suma = k;
for (int i = 1;i <= N;i++) ans[i] = tans[i];
}
}
cout<<ans[1];
for (int i = 2;i <= N;i++) cout<<", "<<ans[i];
cout<<endl;
cout<<"Number of fish expected: "<<maxa<<endl;
cout<<endl;
}
return 0;
}
/*
example:2s.
1.题意理解错了,路程上花的时间==t[i]*5;
2.一个代码逻辑错误,在程序中间部分修改了f[i]的值,
以至于影响了后面的枚举。
这么菜的题目都写成这个样子,还得多连啊~~~
*/