Pat乙级练习1采花生

2024-01-16 14:38
文章标签 练习 pat 采花 乙级

本文主要是介绍Pat乙级练习1采花生,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

采花生

  •  
  •  
  •  

时间限制 1000 ms 内存限制 16384 KB 代码长度限制 100 KB 判断程序 Standard (来自 小小)

题目描述

鲁宾逊先生有一只宠物猴,名叫多多。这天,他们两个正沿着乡间小路散步,突然发现路边的告示牌上贴着一张小小的纸条:“欢迎免费品尝我种的花生!——熊字”。
鲁宾逊先生和多多都很开心,因为花生正是他们的最爱。在告示牌背后,路边真的有一块花生田,花生植株整齐地排列成矩形网格。有经验的多多一眼就能看出,每棵花生植株下的花生有多少。为了训练多多的算术,鲁宾逊先生说:“你先找出花生最多的植株,去采摘它的花生;然后再找出剩下的植株里花生最多的,去采摘它的花生;依此类推,不过你一定要在我限定的时间内回到路边。”
我们假定多多在每个单位时间内,可以做下列四件事情中的一件:
1. 从路边跳到最靠近路边(即第一行)的某棵花生植株;
2. 从一棵植株跳到前后左右与之相邻的另一棵植株;
3. 采摘一棵植株下的花生;
4. 从最靠近路边(即第一行)的某棵花生植株跳回路边。
现在给定一块花生田的大小和花生的分布,请问在限定时间内,多多最多可以采到多少个花生?
注意可能只有部分植株下面长有花生,假设这些植株下的花生个数各不相同。例如花生田里只有位于(2, 5), (3, 7), (4, 2), (5, 4)的植株下长有花生,个数分别为 13, 7, 15, 9。多多在 21 个单位时间内,只能经过(4, 2)、(2, 5)、(5, 4),最多可以采到 37 个花生。

 

输入描述:

输入包含多组数据,每组数据第一行包括三个整数 M(1≤M≤20)、N(1≤N≤20)和 K(0≤K≤1000),用空格隔开;表示花生田的大小为 M * N,多多采花生的限定时间为 K个单位时间。
紧接着 M 行,每行包括 N 个自然数 P(0≤P≤500),用空格隔开;表示花生田里植株下花生的数目,并且除了0(没有花生),其他所有植株下花生的数目都不相同。


 

输出描述:

对应每一组数据,输出一个整数,即在限定时间内,多多最多可以采到花生的个数。

 

输入例子:

6 7 21
0 0 0 0 0 0 0
0 0 0 0 13 0 0
0 0 0 0 0 0 7
0 15 0 0 0 0 0
0 0 0 9 0 0 0
0 0 0 0 0 0 0

 

输出例子:

37

---------------------------------------------------------------------------------------------------------------------------------------------------------

(1).将每株花生抽象成节点Node,节点包含横纵坐标信息用来表示时间单位,以及花生数count;

(2).将node添加到集合中,并对集合根据count数降序排序;

(3).循环遍历node集合,逐渐累积花生总数,及消耗的时间单位,每循环一层,判断多取一个节点时,时间单位是否超出范围,如果超出,及跳出循环,如果不超出继续循环;

(4).有一点需要注意,一个是取花生需要消耗一单位时间,二是每多取一个节点的花生,需要考虑回到路边所消耗的时间单位,如果未超出范围,进行下次循环前,需要从消耗总时间单位中减掉到路边的时间单位;

(5).这一题其实比较简化,如果要找出能获取最多花生数的最优解就比较难了,该题找花生的原则是从多往少找,而不用考虑时间消耗是否最佳。

--------------------------------------------------------------------------------------------------------------------------------------------------------------
 

package niuke_Pat_b_test;
import java.util.Collections;
import java.util.Comparator;
import java.util.LinkedList;
import java.util.List;
import java.util.Scanner;
public class B_1 {public static void main(String[] args) {class Node{int x;int y;int count;Node(int x,int y,int count){this.x = x;this.y = y;this.count = count;}}Comparator<Node> myCompartor = new Comparator<Node>(){  @Overridepublic int compare(Node o1, Node o2) {if(o1 == null || o2 == null){return -1;}int count1 = o1.count;int count2 = o2.count;if(count1 < count2){return 1;}else if(count1 == count2){return 0;}else{return -1;}}};Scanner scan = new Scanner(System.in);while(scan.hasNext()){int M = scan.nextInt();//行int N = scan.nextInt();//列int K = scan.nextInt();//步数List<Node> nodeList = new LinkedList<Node>();for (int i = 1; i <= M; i++) {for (int j = 1; j <= N; j++) {int count = scan.nextInt();Node node = new Node(j,i,count);nodeList.add(node);}}Collections.sort(nodeList, myCompartor);int total = 0;int steps = 0;int size = nodeList.size();for (int i = 0; i < size; i++) {int tempTotal = total;total = total + nodeList.get(i).count;if(i == 0){steps = steps + 2*nodeList.get(i).y + 1;}else{steps = steps + Math.abs((nodeList.get(i).y - nodeList.get(i-1).y)) +Math.abs((nodeList.get(i).x - nodeList.get(i-1).x)) + nodeList.get(i).y + 1;}if(steps > K){total = tempTotal;break;}else{steps = steps - nodeList.get(i).y;}}System.out.println(total);		                         }}}

 

这篇关于Pat乙级练习1采花生的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/612917

相关文章

RabbitMQ练习(AMQP 0-9-1 Overview)

1、What is AMQP 0-9-1 AMQP 0-9-1(高级消息队列协议)是一种网络协议,它允许遵从该协议的客户端(Publisher或者Consumer)应用程序与遵从该协议的消息中间件代理(Broker,如RabbitMQ)进行通信。 AMQP 0-9-1模型的核心概念包括消息发布者(producers/publisher)、消息(messages)、交换机(exchanges)、

【Rust练习】12.枚举

练习题来自:https://practice-zh.course.rs/compound-types/enum.html 1 // 修复错误enum Number {Zero,One,Two,}enum Number1 {Zero = 0,One,Two,}// C语言风格的枚举定义enum Number2 {Zero = 0.0,One = 1.0,Two = 2.0,}fn m

MySql 事务练习

事务(transaction) -- 事务 transaction-- 事务是一组操作的集合,是一个不可分割的工作单位,事务会将所有的操作作为一个整体一起向系统提交或撤销请求-- 事务的操作要么同时成功,要么同时失败-- MySql的事务默认是自动提交的,当执行一个DML语句,MySql会立即自动隐式提交事务-- 常见案例:银行转账-- 逻辑:A给B转账1000:1.查询

html css jquery选项卡 代码练习小项目

在学习 html 和 css jquery 结合使用的时候 做好是能尝试做一些简单的小功能,来提高自己的 逻辑能力,熟悉代码的编写语法 下面分享一段代码 使用html css jquery选项卡 代码练习 <div class="box"><dl class="tab"><dd class="active">手机</dd><dd>家电</dd><dd>服装</dd><dd>数码</dd><dd

014.Python爬虫系列_解析练习

我 的 个 人 主 页:👉👉 失心疯的个人主页 👈👈 入 门 教 程 推 荐 :👉👉 Python零基础入门教程合集 👈👈 虚 拟 环 境 搭 建 :👉👉 Python项目虚拟环境(超详细讲解) 👈👈 PyQt5 系 列 教 程:👉👉 Python GUI(PyQt5)文章合集 👈👈 Oracle数据库教程:👉👉 Oracle数据库文章合集 👈👈 优

如何快速练习键盘盲打

盲打是指在不看键盘的情况下进行打字,这样可以显著提高打字速度和效率。以下是一些练习盲打的方法: 熟悉键盘布局:首先,你需要熟悉键盘上的字母和符号的位置。可以通过键盘图或者键盘贴纸来帮助记忆。 使用在线打字练习工具:有许多在线的打字练习网站,如Typing.com、10FastFingers等,它们提供了不同难度的练习和测试。 练习基本键位:先从学习手指放在键盘上的“家位”开始,通常是左手的

anaconda3下的python编程练习-csv翻译器

相关理解和命令 一、环境配置1、conda命令2、pip命令3、python命令 二、开发思路三、开发步骤 一、环境配置 1、conda命令 镜像源配置 conda config --show channels //查看镜像源conda config --remove-key channels //删除添加源,恢复默认源#添加镜像源conda config --ad

推荐练习键盘盲打的网站

对于初学者来说,以下是一些推荐的在线打字练习网站: 打字侠:这是一个专业的在线打字练习平台,提供科学合理的课程设置和个性化学习计划,适合各个水平的用户。它还提供实时反馈和数据分析,帮助你提升打字速度和准确度。 dazidazi.com:这个网站提供了基础的打字练习,适合初学者从零开始学习打字。 Type.fun打字星球:提供了丰富的盲打课程和科学的打字课程设计,还有诗词歌赋、经典名著等多样

综合DHCP、ACL、NAT、Telnet和PPPoE进行网络设计练习

描述:企业内网和运营商网络如上图所示。 公网IP段:12.1.1.0/24。 内网IP段:192.168.1.0/24。 公网口PPPOE 拨号采用CHAP认证,用户名:admin 密码:Admin@123 财务PC 配置静态IP:192.168.1.8 R1使用模拟器中的AR201型号,作为交换路由一体机,下图的WAN口为E0/0/8口,可以在该接口下配置IP地址。 可以通过

JAVA学习-练习试用Java实现“删除有序数组中的重复项”

问题: 给你一个有序数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。 不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。 说明: 为什么返回数值是整数,但输出的答案是数组呢? 请注意,输入数组是以「引用」方式传递的,这意味着在函数里修改输入数组对于调用者是可见的。 你可以想象内部操作如下