18-0213-P1086 花生采摘

本文针对一道关于猴子摘取花生的算法题目进行了解析,强调了读题的重要性,并提供了具体的实现代码。文章指出了常见的理解误区,如未能注意到每次只能拿取最大花生株的要求等。

常见问题:

问题一:读题时应该仔细读。有的同学没有看到每次只能拿剩下花生株中最大的,而是希望找到一种在规定时间内能够拿最多花生的组合,把题目变成了另外一道题。

问题二:有的同学没有读到“没有两株花生株的花生数目相同”的条件,因此把题目复杂化了。

问题三:这个题目是假设猴子在取花生的过程中不会回到大路上的,有些同学在思考是否可能在中间回到大路上,因为题目没说在大路上移动要花时间,所以有可能中途出来再进去摘的花生更多。

——摘自洛谷题解。


#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
using namespace std;
struct point{
	int x,y,num;
};
bool cmp1(point A,point B){//按照花生数目降序 
	return A.num>B.num;
}
point po[410];
int CountP=0;
int Count=0;
int M,N,K;
int ans[21][21];
int r,c;
int main()
{
	freopen("input.txt","r",stdin);
	//freopen("output.txt","w",stdout);
	cin>>M>>N>>K;
	for(int i=1;i<=M;i++)
		for(int j=1;j<=N;j++){//输入每个点的花生,并且将数量position存放到结构体 
			scanf("%d",&ans[i][j]);
			po[CountP].x=i;
			po[CountP].y=j;
			po[CountP++].num=ans[i][j];
		}
	 sort(po,po+CountP,cmp1);//把所有花生按照数量降序 
	 CountP=0;
	 r=0;c=po[0].y;
	while(po[CountP].num!=0){//只要下一个最大的花生点不为0 就一直找 
		if(K-abs(po[CountP].x-r)-abs(po[CountP].y-c)-1-po[CountP].x<0) break;//判断,到达下一个点无法回到路上,退出整个循环 
		K=(K-abs(po[CountP].x-r)-abs(po[CountP].y-c)-1);//算出移动到下一个点花的时间 
		r=po[CountP].x;//更新当前位置 
		c=po[CountP].y;
		Count+=po[CountP].num;//花生计数 
		CountP++;
	}
	cout<<Count;
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值