/////////////////////////////////////////////////////////////////
//1161 多湖钓鱼 枚举+贪心 也是POJ 1042
//其一,John在路上花费的时间只与最终到达最远的湖有关;其二,只需考虑在不同的湖停留的时间,不要考虑先后。
//所以可以对于最终到达第1到第25个湖这n种情况,先扣除路上时间,在剩下的时间不断用贪心挑可钓鱼数最大的湖选择就行

 

//搞了很久都不知道为什么超时,疯了。。。

#include<stdio.h>
#include<string.h>


int main()
{
    int fi[30]; int di[30]; int ti[30];
    int fishleft[30]; int tempLakeTime[30]; int resLakeTime[30];
    int sumFish;

    int testcase,lakeNum,fishingTime;
    int i,beforeMark,leftTime;
    int tempSum;

    int currentMaxLoc;
    int currentMaxVal;
    int sum;
    int time;

    scanf("%d", &testcase);
    while(testcase--)
    {
        scanf("%d",&lakeNum);
        while( !(lakeNum==0))
        {
            scanf("%d",&fishingTime);
            fishingTime*=12;
            for(i=0;i<lakeNum;i++)
            {
                scanf("%d",&fi[i]);
                fishleft[i]=fi[i];
            }
            for(i=0;i<lakeNum;i++)
                scanf("%d",&di[i]);
            for(i=1;i<lakeNum;i++)
                scanf("%d",&ti[i]);
            ti[0]=0;

            memset(resLakeTime,0,sizeof(resLakeTime));
            sumFish=0; leftTime=fishingTime;
            for(beforeMark=1;beforeMark<=lakeNum;beforeMark++)
            {
                memset(tempLakeTime,0,sizeof(tempLakeTime));
                leftTime-=ti[beforeMark-1];

                sum=0;
                time=leftTime;
                while(time--)
                {
                    currentMaxLoc=0;
                    currentMaxVal=0;
                    for(i=0;i<beforeMark;i++)
                        if(currentMaxVal<fishleft[i])
                        {
                            currentMaxVal=fishleft[i];
                            currentMaxLoc=i;
                        }

                    sum+=currentMaxVal;
                    fishleft[currentMaxLoc]-=di[currentMaxLoc];
                    tempLakeTime[currentMaxLoc]++;
                }

                for(i=0;i<beforeMark;i++)
                    fishleft[i]=fi[i];
                tempSum=sum;

 

                if(sumFish<tempSum)
                {
                    for(i=0;i<beforeMark;i++)
                        resLakeTime[i]=tempLakeTime[i];
                    sumFish=tempSum;
                }
            }
            for(i=0;i<lakeNum;i++)
            {
                printf("%d",resLakeTime[i]*5);
                if(i!=lakeNum-1)
                    printf(", ");
            }
            printf("\nNumber of fish expected: %d\n",sumFish);
           
            scanf("%d",&lakeNum);
            if(lakeNum!=0)
                printf("\n");
        }
        if(testcase>0)
            printf("\n");
    }
    return 0;
}

 

//        tempSum=LakeResult(beforeMark,leftTime);

/*

int LakeResult(int n,int time)
{
    int i,currentMaxLoc;
    int currentMaxVal;
    int sum=0;
    while(time--)
    {
        currentMaxLoc=0;
        currentMaxVal=0;
        for(i=0;i<n;i++)
            if(currentMaxVal<fishleft[i])
            {
                currentMaxVal=fishleft[i];
                currentMaxLoc=i;
            }

            sum+=currentMaxVal;
            fishleft[currentMaxLoc]-=di[currentMaxLoc];
            tempLakeTime[currentMaxLoc]++;
    }

    for(i=0;i<n;i++)
        fishleft[i]=fi[i];
    return sum;
}

*/

posted on 2010-11-23 14:08  VRS  阅读(546)  评论(0编辑  收藏  举报