• poj 1042(贪心)


    寒假里做的第一道题,结结实实的被特给虐了。。华丽丽的WA了不下20次,最后没办法了还是让别人给找出来的错!悲催... 

    这题用贪心,枚举到第i个岛结束,从总时间里减掉走到这个岛所用时间。然后从前i个岛里贪心出最大值。

    错在两个地方:

    1. 题目要求多余的时间放到第一个岛上,我在选取的max为负里加上了cur=0,把时间直接加到了第一个岛上。

    其实这里不需要单独处理,在贪心前已经让cur=0,如果max<0.fish,cur不改变。简直多此一举

    2. fish数量为负时的清零跟递减的顺序,我是清零后使cur=0,然后对f[0]递减。

    这样操作对fish为负的情况可以,但fish递减后为负的情况就没办法处理了,可能造成后面贪心过程中岛的选取的错误。

     

    #include<iostream>
    #include<fstream>
    #include<cstring>
    #include<cstdlib>
    #define Max(a, b)   a>b?a:b
    using namespace std ;

    struct F{
        int fish ;
        int desc ;
        int walk ;
    };
    F f[30] ;
    F ftemp[30] ;
    int time[30][30] ;
    int sum[30] ;

    int main(){
        int n, h, total, i, j, max, maxf, cur, temp ;
        //fstream cin("in.dat", ios::in) ;
        while(~scanf("%d", &n)&&n){
            scanf("%d", &h) ;
            for(i=0; i<n; i++)
                scanf("%d", &f[i].fish) ;
            for(i=0; i<n; i++)
                scanf("%d", &f[i].desc) ;
            for(i=1; i<n; i++)
                scanf("%d", &f[i].walk) ;
            total = 12 * h ;
            f[0].walk = 0 ;
            memset(time, 0sizeof(time)) ;
            memset(sum, 0sizeof(sum)) ;
            for(i=0; i<n; i++){         //枚举到第i个湖结束
                total -= f[i].walk ;
                temp = total ;
                memcpy(ftemp, f, (i+1)*sizeof(F)) ;
                while(temp>0){          //贪心
                    maxf = ftemp[0].fish ;
                    cur = 0 ;           //每次贪心开始标记的位置cur=0确保了剩余时间归属
                    for(j=1; j<=i; j++){
                        if(maxf<ftemp[j].fish){
                            maxf = ftemp[j].fish ;
                            cur = j ;
                        }
                    }
                    sum[i] += ftemp[cur].fish ;
                    ftemp[cur].fish -= ftemp[cur].desc ;
            //这里要递减完再解决非正情况
                    if(ftemp[cur].fish<0)
                        ftemp[cur].fish = 0 ;
                    time[i][cur] ++ ;
                    temp -- ;
                }
            }
            max = -1 ;
            cur = 0 ;
            for(i=0; i<n; i++){
                if(sum[i]>max){
                    max = sum[i] ;
                    cur = i ;
                }
            }
            cout << time[cur][0]*5 ;
            for(i=1; i<n; i++)
                cout << "" << time[cur][i]*5 ;
            cout << endl << "Number of fish expected: " << sum[cur] << endl << endl ;
        }

    错误代码块:

    maxf = ftemp[0].fish ;
    cur = 0 ;
    for(j=1; j<=i; j++){
        if(maxf<ftemp[j].fish){
            maxf = ftemp[j].fish ;
            cur = j ;
        }
    }
    if(ftemp[cur].fish<=0){
        ftemp[cur].fish = 0 ;
        cur = 0 ;
    }
    sum[i] += ftemp[cur].fish ;
    ftemp[cur].fish -= ftemp[cur].desc ;
    time[i][cur] ++ ;

    temp -- ; 

  • 相关阅读:
    670. Maximum Swap
    653. Two Sum IV
    639. Decode Ways II
    636. Exclusive Time of Functions
    621. Task Scheduler
    572. Subtree of Another Tree
    554. Brick Wall
    543. Diameter of Binary Tree
    535. Encode and Decode TinyURL
    博客园自定义背景图片
  • 原文地址:https://www.cnblogs.com/xiaolongchase/p/2324163.html
Copyright © 2020-2023  润新知