luogu1086:花生采摘:棋盘判断问题:NOIP2004普及组T2

题目连接:该题是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;
}

猜你喜欢

转载自blog.csdn.net/liusu201601/article/details/88387236