这道题的难度大概就是普及组了,写这个题解的原因有两个。一个是刚开博客的激动未消,另一个是为了纪念我为了它所多用的两个小时。
要减去横坐标的时候我减了纵坐标,导致有三个点过不了(这题数据太水了,就这样还给了我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; }