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

题目链接: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);
    }
}
        



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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值