zoj 1611//钓鱼,贪心

#include<stdio.h>
void block()
{
int i,j,k,g,n,h,ans,tot,f[32],d[32],t[32],now[32];//f[i]第一个5分钟能钓的鱼
    scanf("%d",&n);//n个湖
  while (n)
       {
               scanf("%d",&h);
              h=h*12;//一小时有12个5分钟,以五分钟为单位
              for(i=0;i<n;i++)
              {
                     scanf("%d",&f[i]);
                     now[i]=f[i];
              }
              for(i=0;i<n;i++)
                     scanf("%d",&d[i]);
              for(i=0;i<n-1;i++)
                     scanf("%d",&t[i]);//跨湖时间
             int times[32]={0};
              ans=0;
              
              
              
              
              
              for(i=0;i<n&&h>0;i++)//这个for循环的意思要懂,表示有n种方案1、只钓第一个湖 2.从第一个钓到第二个湖 ....n、从第一个钓到第n个
              {
                for(j=0;j<i;j++)
                         now[j]=f[j];
                  int tnow[32]={0};tot=0;
                     for(k=0;k<h;k++)//在某个方案里,在h时间之内可以求出最多鱼的总量
                     {    
                          g=0;//用于标记当前某个湖能钓到最多鱼
                          for(j=1;j<=i;j++)
                               if(now[j]>now[g])//找到最多鱼的湖
                                   g=j;
                            tot=tot+now[g];//所钓到的鱼的总量自增
                            now[g]=now[g]-d[g];
                            if(now[g]<0)
                               now[g]=0;
                            tnow[g]++;//第g个湖时间自增
                     }
                     if(tot>ans)//表示当前方案与上一个方案鱼的总数进行比较,找出好的方案
                     {
                            ans=tot;
                            for(j=0;j<n;j++)
                                   times[j]=tnow[j];//每个湖所用的时间
                     }
                     else if(tot==ans)
                     {
                            for(j=0;j<n;j++)
                                   if(tnow[j]!=times[j])//若第一个湖和第二个湖的鱼数量相等,选择第一个湖
                                          break;
                            if(j<n&&tnow[j]>times[j])
                                   for(g=j;g<n;g++)
                                          times[g]=tnow[g];
                     }
                     h=h-t[i];
              }
              for(i=0;i<n-1;i++)//输出格式的巧妙化处理,将最后一湖的个时间与expected鱼一同输出,但用换行来隔开
               printf("%d, ",times[i]*5);//这里注意逗号后面有空格,不然提交后会说“presentation error”
              printf("%d\nNumber of fish expected: %d\n",times[n-1]*5,ans);
     
     
     scanf("%d",&n);
     if(n)//题目要求每个case之间要有空行
    printf("\n");
       
}



int main()
{
      
 int i,N;
 scanf("%d",&N);
 for(i=0;i<N;i++)
 {
 block();
 if(i!=N-1)//题目要求每个block之间要有空行
 printf("\n"); 
 }
       return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值