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 210 0 0 0 0 0 00 0 0 0 13 0 00 0 0 0 0 0 70 15 0 0 0 0 00 0 0 9 0 0 00 0 0 0 0 0 0

输出例子:

37

对应代码:
 1 /*
 2 http://www.nowcoder.com/pat/2/problem/249
 3 author: ly   2016.6.19
 4 */
 5 #include<iostream>
 6 #include<stdio.h>
 7 #include<memory.h>
 8 #include<algorithm>
 9 using namespace std;
10
11 struct MAX
12 {
13     int value;
14     int hang;
15     int lie;
16 }m[50];
17
18
19 //规定降序排列
20 bool cmp(const MAX &a,const MAX &b)
21 {
22     return a.value>b.value;
23 }
24
25 int main()
26 {
27     int M,N,k;
28
29     while(scanf("%d%d%d",&M,&N,&k)!=EOF)
30     {
31       //    cin>>M>>N;    //花生田的大小
32     //    scanf("%d%d",&M,&N);
33         // cin>>k;     //限定时间
34     //    scanf("%d",&k);
35
36          //memset(m,0,sizeof(m));
37            int v=0,top=0;
38
39          int i=0,j=0;
40          for(i=0;i<M;i++)
41              for(j=0;j<N;j++)
42                  {
43                      scanf("%d",&v);
44                       if(v!=0)
45                       {
46                                 m[top].value=v;
47                             m[top].hang=i+1;
48                             m[top].lie=j+1;
49                             top++;
50                       }
51                 }
52
53
54
55         //对于找到的数的大小进行排序
56         sort(m,m+top,cmp);
57
58         //将路边看成一个节点  列与第一个最大子节点相同
59         int x_l=0;
60         int y_l=m[0].lie;    //分x,y方向考虑
61
62         //开始采花生
63         int sum=0,count=0;
64
65     //判断
66      for(i=0;i<top;i++)
67      {
68          //是否符合条件
69          sum+=abs(m[i].hang-x_l);
70          sum+=abs(m[i].lie-y_l);
71
72          sum++;   //摘花生
73          if(sum+m[i].hang>k)
74          break;
75
76          x_l=m[i].hang;
77          y_l=m[i].lie;
78          count+=m[i].value;
79
80      }
81
82     printf("%d\n",count);
83     }
84
85     return 0;
86 } 

  日进一小步,月过一大步!!!加油~~

时间: 2024-10-14 04:39:49

PAT-1001 采花生的相关文章

[编程题]采花生--为什么时间超了?

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

采花生(模拟)

问题 D: 花生采摘 时间限制: 1 Sec  内存限制: 128 MB[提交] [状态] 题目描述 鲁宾逊先生有一只宠物猴,名叫多多.这天,他们两个正沿着乡间小路散步,突然发现路边的告示牌上贴着一张小小的纸条:“欢迎免费品尝我种的花生!——熊字”. 鲁宾逊先生和多多都很开心,因为花生正是他们的最爱.在告示牌背后,路边真的有一块花生田,花生植株整齐地排列成矩形网格(如图1).有经验的多多一眼就能看出,每棵花生植株下的花生有多少.为了训练多多的算术,鲁宾逊先生说:“你先找出花生最多的植株,去采摘它

算法分析实验之采花生遗留数组问题的解决

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

PAT 1001. 害死人不偿命的(3n+1)猜想 (15)

题目链接:http://pat.zju.edu.cn/contests/pat-b-practise/1001 卡拉兹(Callatz)猜想: 对任何一个自然数n,如果它是偶数,那么把它砍掉一半:如果它是奇数,那么把(3n+1)砍掉一半.这样一直反复砍下去,最后一定在某一步得到n=1.卡拉兹在1950年的世界数学家大会上公布了这个猜想,传说当时耶鲁大学师生齐动员,拼命想证明这个貌似很傻很天真的命题,结果闹得学生们无心学业,一心只证(3n+1),以至于有人说这是一个阴谋,卡拉兹是在蓄意延缓美国数学

PAT 1001

1001. A+B Format (20) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue Calculate a + b and output the sum in standard format -- that is, the digits must be separated into groups of three by commas (unless there are less than four d

PAT——1001 害死人不偿命的(3n+1)猜想 (15)

对给定的任一不超过1000的正整数n,简单地数一下,需要多少步(砍几下)才能得到n=1? 输入格式:每个测试输入包含1个测试用例,即给出自然数n的值. 输出格式:输出从n计算到1需要的步数. 输入样例: 3 输出样例: 5 import java.util.Scanner; public class Main{ public static void main(String[] args){ int i = 0; Scanner s = new Scanner(System.in); int a

PAT 1001. 害死人不偿命的(3n+1)猜想

1001. 害死人不偿命的(3n+1)猜想 (15) 卡拉兹(Callatz)猜想: 对任何一个自然数n,如果它是偶数,那么把它砍掉一半:如果它是奇数,那么把(3n+1)砍掉一半.这样一直反复砍下去,最后一定在某一步得到n=1.卡拉兹在1950年的世界数学家大会上公布了这个猜想,传说当时耶鲁大学师生齐动员,拼命想证明这个貌似很傻很天真的命题,结果闹得学生们无心学业,一心只证(3n+1),以至于有人说这是一个阴谋,卡拉兹是在蓄意延缓美国数学界教学与科研的进展-- 我们今天的题目不是证明卡拉兹猜想,

PAT 1001. A+B Format(水题)

#include<cstdio> #include<cstring> using namespace std; char s[10]; int main() { int a,b; while(scanf("%d%d",&a,&b)==2) { memset(s,0,sizeof(s)); a=a+b; if(a==0) { printf("0\n"); continue; } int aa=a; b=0; if(a<0)

PAT 1001. A+B Format

#include<stdio.h> int a, b; int sum; int main(){ while (scanf("%d %d", &a, &b)!=EOF){ sum = a + b; if (sum < 1000&&sum>-1000)printf("%d\n", sum); else{ int sum1 = sum % 1000; int sum2 = sum / 1000; int sum3