P1086 花生采摘题解

时间:2023-02-10 20:43:20

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

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

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

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

思路也很简单:用结构体存下每一个有价值的花生植株,其余结了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;
}

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