您的位置:首页 > 编程语言 > Go语言

poj-1042 && nyoj-30(Gone fishing)

2014-01-17 19:25 489 查看
题目链接:poj ->http://poj.org/problem?id=1042

nyoj->http://acm.nyist.net/JudgeOnline/problem.php?pid=30

题意;有n个湖,每个湖都有fi条鱼,每钓一次就会减少di条鱼,

问一个人在给定的时间内在按照从 1~n 湖中钓的鱼最多是多少,

并输出这个人在些湖中停留的时间

题解: 贪心 + 枚举

注: 枚举所有情况(即1~n的湖)每次找湖中鱼最大的

#include<stdio.h>
#include<string.h>
int f1[30],f2[30];
int t[30],t1[30],t2[30];
int res[30];
int main()
{
int n,m,i,j,ret,q = 0;
int time, time1 , time2;
while(scanf("%d",&n),n)
{
scanf("%d",&m);
time = m * 60;
memset(f2,0,sizeof(f2));
for(i = 0 ; i < n; i ++)
{
scanf("%d",&f1[i]);
f2[i] = f1[i] ;
}
for(i = 0 ; i < n; i ++) scanf("%d",&res[i]);
for(i = 1; i < n;i ++) scanf("%d",&t[i]);
if(q) printf("\n");
q = 1;
int Max = -1;//这个max要小于0
memset(t2,0,sizeof(t2));
for(i = 0 ; i < n; i ++)
{
memset(t1,0,sizeof(t1));
for(j = 0; j < n ; j ++) f1[j] = f2[j];//还原
time1 = time;
for(j = 0 ; j <= i;j ++) time1 -= t[j] * 5;//去湖之间所用的时间
time2 = time1;
int sum = 0;
while(time2 > 0)
{
int max = 0;//注:这个max要等于0
int flag = 0,p=0;
for(j = 0 ; j <= i; j ++) //每次查找鱼最多的湖
{
if(max < f1[j])
{
max = f1[j];
p = j ;
flag = 1;
}
}
if(flag) t1[p] += 5;
sum += max ;
if(f1[p] > 0) f1[p] -= res[p] ;
time2 -= 5;
}
if(Max < sum )
{
Max = sum ;
ret = time1;
for(j = 0 ; j < n ; j ++)
t2[j] = t1[j] ;
}
}
int ans = 0 ;
for(i = 1; i < n;i ++) ans += t2[i];
t2[0] = ret - ans ;
printf("%d",t2[0]);
for(i = 1; i < n;i ++)
printf(", %d",t2[i]);
printf("\n");
printf("Number of fish expected: %d\n",Max);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: