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

  • 相关阅读:
    几个用于序列化的代码片段
    一个统计查询写的哥要哭了
    pb数据窗口数据输入的下拉选择效果
    PB代码块
    获取指定表的字段信息sql2005
    TSQL时间格式化显示
    Atitit 为什么互联网金融会得到高层的支持 面子工程战略 政绩战略 大事业战略 高层需要在意识形态创新全球,政绩工程 得到合法性。 银行有很多家,而且别的区域也有。。不独特。。但是支付
    Atitit 软件与互联网理论 attilax总结
    Atitit 软件与开发的未来趋势 attilax总结 1.1. Sdx软件重构世界 软件定义未来 1 1.2. 《软件和信息技术服务业发展规划(20162020年)》( 2 1.3. Iot物联
    Atitit it业界与软件界的定律 原则 准则 法则 效应
  • 原文地址:https://www.cnblogs.com/xiaolongchase/p/2324163.html
Copyright © 2011-2022 走看看