题目连接:该题是luogu试炼场的2-2:T4
题目大意:
1 给出一个棋盘,某些格子里有值代表花生,小狗在第0行,有体力值,体力通过以下4种操作消耗;
2 有4种操作:
1)从第0行(路边)进入第1行;
2)在棋盘内移动一格;
3)在有值的位置停留(采摘);
4)从第1行回到第0行(路边);
3 要求小狗从路边出发,体力消耗完之前,必须回到路边,采摘尽可能多的花生;
解题思路:
1 记录每棵树的坐标、花生数量;
2 对每棵树进行排序,枚举一次;
3 如果这棵树采完能走出去,采,否则游戏结束。
上代码:
//luogu1086:花生采摘
//棋盘问题+出路判断
//解题思路:
//1 记录每棵树的坐标、花生数量;
//2 对每棵树进行排序,枚举一次。
//3 如果这棵树采完能走出去,采,否则游戏结束。
#include<cstdio>
#include<algorithm>
using namespace std;
int nn,m,t,n=0,ans=0;
struct nod{int x,y,c;}a[1010];//记录每棵花生的信息
bool cmd(nod x, nod y)
{
return x.c>y.c;
}
void pre()//读入与排序,确定采摘顺序
{
scanf("%d %d %d",&nn,&m,&t);
int x;
for(int i=1;i<=nn;i++)
{
for(int j=1;j<=m;j++)
{
scanf("%d",&x);
if(x>0)
{
n++;
a[n].x=i; a[n].y=j; a[n].c=x;
}
}
}
sort(a+1,a+1+n,cmd);//花生排序
}
int main()
{
pre();//数据准备
if(t<a[1].x*2+1) { printf("0"); return 0;}//第一棵特判
ans+=a[1].c;//第一棵可以采
int at=t-a[1].x-1;//采到第一棵后,剩余时间
int dx,dy,dt,et;
for(int i=2;i<=n;i++)
{
dx=abs(a[i].x-a[i-1].x);
dy=abs(a[i].y-a[i-1].y);
dt=dx+dy; //从(i-1)走到i的距离
et=a[i].x+1;//采了i,并且走出去需要的时间
if(dt+et<=at)//第i棵采集能到并能出去
{
ans+=a[i].c;
at=at-dt-1;//采集 i
}
else break;//如果 i 采不了,游戏结束
}
printf("%d",ans);
return 0;
}