ZOJ1161-Gone Fishing

1

2        //n

1        //h

10 1   //fi

2 5     //di

2        //ti

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

0

 

 

完整程序:

#include<bits/stdc++.h>
using namespace std;
//ZOJ1161-Gone Fishing贪心算法
//每个湖预计钓到鱼的数量,定义为数组:
#define NUM 30
int f[NUM];
//每个湖预计钓到鱼的数量的递减值,定义为数组:
int d[NUM];
//相邻湖之间的旅行时间,定义为数组:
int t[NUM];
//钓鱼计划,定义为数组:
int plan[NUM];
//湖的个数n,用于钓鱼的时间h,尽可能多的钓鱼数量best。
int n,h,best;
//选择鱼最多的湖钓鱼的贪心算法实现
//从湖1起到湖pos止,花费时间time(不含路程)的钓鱼计划
void greedy(int pos, int time)
{
if (time <= 0) return;//时间已经用完
int i, j;
int fish[NUM];
int p[NUM];
int t = 0;
for (i = 0; i < pos; ++i)
fish[i] = f[i];
memset(p, 0, sizeof(p));
//在时间time内,选择鱼最多的湖钓鱼;如果鱼都没有了,就把时间放在湖1上
for (i = 0; i < time; ++i)
{
int max = 0;		//鱼最多的湖中,鱼的数量
int id = -1;//鱼最多的湖的编号
//查找鱼最多的湖中,鱼的数量和湖的编号
for (j = 0; j < pos; ++j)
if (fish[j] > max){
max = fish[j];
id = j;
}
if (id != -1)//找到了,进行钓鱼处理
{
++p[id];
fish[id] -= d[id];
t += max;
}
//没有找到(从湖1起到湖pos全部钓完了),就把时间放在湖1上
else ++p[0];
}
//处理最优方案
if (t > best)
{
best = t;//最优值
memset(plan, 0, sizeof(plan));
for (i = 0; i < pos; ++i)//最优解
plan[i] = p[i];
}
}
int main()
{
 cout<<"请输入湖的个数:"<<endl;
	while(scanf("%d",&n),n){

     cout<<"请输入钓鱼的时间:"<<endl;
    cin>>h;
     cout<<"请输入每个湖预计钓到的鱼的数量:"<<endl;
    for(int j=0;j<n;j++){
        cin>>f[j];
    }
     cout<<"请输入每个湖预计钓到鱼的数量的递减值:"<<endl;
    for(int j=0;j<n;j++){
        cin>>d[j];
    }
     cout<<"请输入在两个湖之间的路程时间:"<<endl;
    for(int j=1;j<n;j++){
        cin>>t[j];
    }
    int time=0;//花费在路程上的时间
    h=h*60/5;
    best = -1;
   for(int k=1;k<=n&&h-time;++k){
        greedy(k,h-time);
        time+=t[k];
    }
for (int i = 0; i < n - 1; ++i)
				printf("%d, ", plan[i] * 5);
			printf("%d\n", plan[n - 1] * 5);
			printf("Number of fish expected: %d\n", best);
 cout<<"请输入湖的个数:"<<endl;
}
return 0;
}

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Famiglistimott

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值