• P1086 花生采摘题解


    这道题只是普通的模拟,不是贪心!

    重点在于这句话:“然后再找出剩下的植株里花生最多的,去采摘它的花生”。

    也就是,你下一个必须找到剩下花生最多的,而不是按照贪心思想来考虑在限定时间内的最优解

    那么,应题目要求,这只是一道简单的模拟;

    思路也很简单:用结构体存下每一个有价值的花生植株,其余结了0个花生的不用管,

    然后用自定义cmp函数进行按价值从大到小的顺序排序,之后从最大的开始累加,一直到再加就超过时限或者全部有结果的植株都加完了为止,之后输出答案ans就可以了;

    AC代码如下:

    #include<bits/stdc++.h>
    using namespace std;
    int m,n,k,value,num=0,ans=0,time1=0;
    struct zbx{
        int x,y,peanut;
    }hs[401];
    bool cmp(zbx a,zbx b)
    {
        return a.peanut>b.peanut;
    }
    int main(){
        scanf("%d%d%d",&m,&n,&k);
        for(int i=1;i<=m;i++)
            for(int j=1;j<=n;j++)
            {
                scanf("%d",&value);
                if(value!=0)
                {
                    ++num;
                    hs[num].peanut=value;
                    hs[num].x=j;hs[num].y=i;
                }
            }
        sort(hs+1,hs+num+1,cmp);
        for(int i=1;i<=num;i++)
        {
            if(i==1)//第一个需要特殊判断 
            {
                time1+=hs[1].y+1;
                if(time1+hs[1].y>k)
                {
                    printf("0");return 0;
                }
                else ans+=hs[1].peanut;
            }
            else//其他的普遍情况 
            {
                time1+=abs(hs[i].x-hs[i-1].x)+abs(hs[i].y-hs[i-1].y)+1;
                if(time1+hs[i].y>k)
                {
                    printf("%d",ans);return 0;//如果过了时限,不继续累加了,输出答案直接结束程序 
                }
                else 
                {
                    ans+=hs[i].peanut;
                }
            }    
        }
        printf("%d",ans);
        return 0;
    }

    完结✿✿ヽ(°▽°)ノ✿

  • 相关阅读:
    (1)MySQL初识
    ESP8266(WIFI模组)_Lua开发:环境搭建
    那些年写过的毕设论文
    单片机的心跳SysTick
    尝试
    菜单管理设计说明
    mybatis的mapper.xml中sql的用法
    powerdesigner
    Cookie
    java自定义注解
  • 原文地址:https://www.cnblogs.com/lbssxz/p/10964299.html
Copyright © 2020-2023  润新知