zoukankan      html  css  js  c++  java
  • 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 -- ; 

  • 相关阅读:
    华为数据之道03
    机器学习10讲 第二讲
    机器学习10讲 第一讲
    07.TensorFlow双向循环神经网络
    06.TensorFlow循环神经网络
    华为数据之道:华为数据治理2
    线性回归
    MySQL配置文件my.cnf的理解
    Linux怎么查看软件安装路径 查看mysql安装在哪
    hadoop-2.7.4-nodemanager无法启动问题解决方案
  • 原文地址:https://www.cnblogs.com/xiaolongchase/p/2324163.html
Copyright © 2011-2022 走看看