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 -- ; 

原文地址:https://www.cnblogs.com/xiaolongchase/p/2324163.html