【1086】 花生采摘 模拟贪心 普及-

这道题的难度大概就是普及组了,写这个题解的原因有两个。一个是刚开博客的激动未消,另一个是为了纪念我为了它所多用的两个小时。

要减去横坐标的时候我减了纵坐标,导致有三个点过不了(这题数据太水了,就这样还给了我70)

所以大家写程序的时候一定要仔细啊:)

#include<bits/stdc++.h>
using namespace std;
int n,m,k;
struct gjc{
    int x,y,z;
} p[510];
int ans;
int cnt;
bool cmp(gjc a,gjc b)
{
    return a.z>b.z;
}//自定义一下快排 
int find(int xx,int yy){
    int a,b;
    a=xx-p[cnt].x;
    b=yy-p[cnt].y;
    if(a<0) a=-a;
    if(b<0) b=-b;
    return a+b+1;
}//走路和采摘要用的时间 
int search(int s)//s纵坐标 
{
    int num=0;//当前所消耗时间 
    int val=0;//采摘了的花生的总价值 
    int t=0;//横坐标 
    while(num<=k)//当消耗体力小于等于k时 
    {
        int cost=find(t,s);//采摘下一个花生所消耗的时间 
        if(num+cost+p[cnt].x>k) return ans;//如果下一个花生无法采摘或采摘后无法返回,直接返回ans 
        else  ans=max(ans,val+p[cnt].z);//更新ans 
        num=num+cost;//采摘后所耗总时间 
        val=val+p[cnt].z;//总价值 
        t=p[cnt].x;//新的横纵坐标 
        s=p[cnt].y;
        cnt++;//下一个花生 
    }
    return ans;
}
int main(){ cin>>m>>n>>k; for(int i=1;i<=m;i++) for(int j=1;j<=n;j++) { int t; cin>>t; if(t!=0) p[t].x=i,p[t].y=j,p[t].z=t; } sort(p+1,p+510+1,cmp);//根据花生价值从大到小排序 for(int i=1;i<=n;i++) { cnt=1;//重置 ans=search(i); } cout<<ans; return 0; }

 

转载于:https://www.cnblogs.com/cheng-qing/p/9710023.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值