PAT乙级练习题:1001采花生

2023-10-17 23:40
文章标签 练习题 pat 1001 采花 乙级

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

题目描述
鲁宾逊先生有一只宠物猴,名叫多多。这天,他们两个正沿着乡间小路散步,突然发现路边的告示牌上贴着一张小小的纸条:“欢迎免费品尝我种的花生!——熊字”。
鲁宾逊先生和多多都很开心,因为花生正是他们的最爱。在告示牌背后,路边真的有一块花生田,花生植株整齐地排列成矩形网格。有经验的多多一眼就能看出,每棵花生植株下的花生有多少。为了训练多多的算术,鲁宾逊先生说:“你先找出花生最多的植株,去采摘它的花生;然后再找出剩下的植株里花生最多的,去采摘它的花生;依此类推,不过你一定要在我限定的时间内回到路边。”
我们假定多多在每个单位时间内,可以做下列四件事情中的一件:

  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

坑点
1.注意输入的格式,可以有多组输入
2.注意读题目采花的时候也是一个时间单位
3.注意要求是采剩余的最多的花,不是总体采最多的花。
虽然结果可能一致,但是出发点就完全不同了。

题解
在这里插入图片描述
猴子多多从第一行以上跳入,不用算列的移动时间,第一次只需要先算行的时间
在这里插入图片描述
1接着对每个值用一个结构体 “花生peanut” 存起来就行了,
2然后再排序,然后计算路径的时间,
3判断本次去采的时间加回来的时间是否超过了规定时间,
4超过了就舍弃本次的采摘就行了。

代码如下


```cpp
#include<iostream>
#include<vector>
#include<algorithm>using namespace std;struct Peanut{int value;int x;int y;Peanut(){}Peanut(int x,int y,int value){this->x = x;this->y = y;this->value = value;}
};//花生结构体//重载结构体比较,用于sort,只按照值比较即可 
bool cmp(Peanut a,Peanut b){return a.value>b.value;
}//int main(){int col,row,time,sum;int value;int tempi,tempj;int disttemp;while(scanf("%d %d %d",&row,&col,&time)!=EOF){vector<Peanut> peanut;for(int i = 1; i <= row; i++){for(int j = 1; j <= col; j++){scanf("%d",&value);if(value>0){peanut.push_back(Peanut(i,j,value));}}}//          [,) 排序的规则 sort(peanut.begin(),peanut.end(),cmp);sum = 0;if(peanut.size()){//排除全为0的情况,无花 tempi = 0;tempj = peanut[0].y;//第一次不计较列的移动,  行从1开始,猴子此时在0行for(int i = 0; i < peanut.size(); i++){//本次的移动比较;  包含一次采的时间 disttemp = abs(tempi-peanut[i].x)+abs(tempj-peanut[i].y) + 1;if(disttemp + peanut[i].x<= time) ///本次移动到菜花的距离加上返回的时间 {time -= disttemp;//此时还未返回,只需减掉中途的一部分 tempi = peanut[i].x;tempj = peanut[i].y;//更新本次猴子的位置,下次比较 sum += peanut[i].value;}else break;}}printf("%d\n",sum);}return 0;
}

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



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

相关文章

dp算法练习题【8】

不同二叉搜索树 96. 不同的二叉搜索树 给你一个整数 n ,求恰由 n 个节点组成且节点值从 1 到 n 互不相同的 二叉搜索树 有多少种?返回满足题意的二叉搜索树的种数。 示例 1: 输入:n = 3输出:5 示例 2: 输入:n = 1输出:1 class Solution {public int numTrees(int n) {int[] dp = new int

C语言练习题之 数组中出现次数超过一半的数

题目描述 给一个长度为 n 的数组,数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。 例如输入一个长度为9的数组[1,2,3,2,2,2,5,4,2]。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。 数据范围:n≤50000,数组中元素的值0≤val≤10000 要求:空间复杂度:O(1),时间复杂度O(n) 输入描述: 保证数组输入非空,且保证有

算法练习题17——leetcode54螺旋矩阵

题目描述 给你一个 m 行 n 列的矩阵 matrix ,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。  代码 import java.util.*;class Solution {public List<Integer> spiralOrder(int[][] matrix) {// 用于存储螺旋顺序遍历的结果List<Integer> result = new ArrayList

百度之星 2015 复赛 1001 (数长方形)

数长方形    Accepts: 595    Submissions: 1225  Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Problem Description 小度熊喜欢玩木棒。一天他在玩木棒的时候,发现一些木棒会形成长方形

PAT甲级-1044 Shopping in Mars

题目   题目大意 一串项链上有n个钻石,输入给出每个钻石的价格。用m元买一个连续的项链子串(子串长度可为1),如果不能恰好花掉m元,就要找到最小的大于m的子串,如果有重复就输出多个,按递增顺序输出子串的前端和后端索引。 原来的思路 取连续的子串使和恰等于m,没有恰等于就找最小的大于。可以将子串依次累加,使得每个位置都是起始位置到该位置的序列和,整个数组显递增顺序,就可以用右边减左边

PAT (Advanced Level) Practice——1011,1012

1011:  链接: 1011 World Cup Betting - PAT (Advanced Level) Practice (pintia.cn) 题意及解题思路: 简单来说就是给你3行数字,每一行都是按照W,T,L的顺序给出相应的赔率。我们需要找到每一行的W,T,L当中最大的一个数,累乘的结果再乘以0.65,按照例子写出表达式即可。 同时还需要记录每一次选择的是W,T还是L

Python练习题——站队顺序输出

题目来源:Python语言程序设计(中国大学MOOC) 题目描述: 有一群人站队,每人通过一对整数(h, k)来描述,其中h表示人的高度,k表示在此人前面队列中身高不小于此人的总人数。 实现一个算法输出这个队列的正确顺序。 输入格式: 输入格式为二维列表,即 list[list[]]形式 外层list包含队列中全部的人,内层list为[h,k]格式,代表个人信息。 输出格式: 输

Python练习题——自幂数(水仙花数)

题目来源:Python语言程序设计(中国大学MOOC) 授课老师:嵩天、黄天羽、礼欣 题目描述: “3位水仙花数”是指一个三位整数,其各位数字的3次方和等于该数本身。例如:ABC是一个”3位水仙花数”,则:A的3次方+B的3次方+C的3次方 = ABC。 请按照从小到大的顺序输出所有的3位水仙花数,请用”逗号”分隔输出结果。 代码: output = []for d in range

Mysql基础练习题 1378.使用唯一标识符替换员工ID (力扣)

1378. 展示每位用户的 唯一标识码(unique ID );如果某位员工没有唯一标识码,使用 null 填充即可。 你可以以任意顺序返回结果表。 题目链接: https://leetcode.cn/problems/replace-employee-id-with-the-unique-identifier/ 建表插入数据: Create table If Not Exists E

环形链表练习题笔记

参考大佬题解 141. 环形链表 - 力扣(LeetCode) 环形链表 141. 环形链表 - 力扣(LeetCode) /*** Definition for singly-linked list.* class ListNode {* int val;* ListNode next;* ListNode(int x) {* val