花生采摘
来源:互联网 发布:建筑施工模拟软件 编辑:程序博客网 时间:2024/04/25 08:44
花生采摘笔记:
题目:
有一个n*m矩阵的花生田,采摘规则如下:你先找出花生最多的植株,去采摘它的花生;然后再找出剩下的植株里花生最多的,去采摘它的花生;依此类推,不过你一定要在我限定的时间内回到路边。”当然不是每个方格内都有花生。
你每个单位时间内可做的事情:
1) 从路边跳到最靠近路边(即第一行)的某棵花生植株;
2) 从一棵植株跳到前后左右与之相邻的另一棵植株;
3) 采摘一棵植株下的花生;
4) 从最靠近路边(即第一行)的某棵花生植株跳回路边。
问你最多能摘到几棵?
诶嘛看到这个题目是不是一脸懵逼!(不存在的)
思路梳理:
一、找到第一个最大数
二、判断能不能回去,计算一下时间:x+x+1并判断2x+1是不是要小于k
三、记录总数Sum=sum+花生的数
四、将a[i][j]=0;
五、记录当前位置:nowx,nowy x,y
距离为abs(nowx-x)+abs(nowy-y)
思路分析:看完上面的过程简要分析后就知道每一次找花生都是先找最大值,判断采摘时间是否足够(要加上回去的时间),如果够,就摘;不够,就回去。(不用担心回不去,因为采摘这株花生的时候条件已经满足,至少已经是可以回去的了)。那么简要分析后,就知道采摘第一株花生是要特判的,因为第一株花生是可以从路边任意位置开始,找到最大值后与它的距离为x,再加上采摘时间1,再加上回去时间x,所以第一次采摘花生的特判时间就为(2x+1)。接下来每次就是找到最大值,判断时间,采摘……知道时间不够用了或花生已经被采完了为止为止。
加黄的思路分析和思路整理非常重要!
那么分析后代码如下:
#include<bits/stdc++.h>
using namespace std;
long int t1,t2,i,j,n,m,x,y,k,maxx,sum,a[101][101],nx,ny;
void find_max(){//查找最大值函数
maxx=0;
for (i=1;i<=n;i++)
for (j=1;j<=m;j++)
if (a[i][j]>maxx){
maxx=a[i][j];x=i;y=j;//记录这个最大值的位置
}
}
int main(){
cin>>n>>m>>k;
for (i=1;i<=n;i++)
for (j=1;j<=m;j++)
cin>>a[i][j];
find_max();//第一次特判
if (2*x+1<=k){//判断时间是否足够
sum+=maxx;//时间足够,累加
a[x][y]=0;//记住,清零,不然以后你每次找的都是这个最大值
k=k-x-1;//时间减去
nx=x;ny=y;//记录当前下标
}
while (k>0){
find_max();
if (maxx==0) break;//如果花生没了
a[x][y]=0;
t1=abs(nx-x)+abs(ny-y)+1;//两株花生间的距离
if (t1+x>k) break;//时间是否足够
k=k-t1;//减去时间
sum+=maxx;//加上花生
nx=x;ny=y;//记录当前下标
}
cout<<sum;//输出
return 0;
}
帮你们吧代码放大点
结束心得:当模拟类题目出来时,先不要着急害怕,一定要想我一样先将思路捋一遍,将题目大致意思搞懂,再根据梳理过的思路进行题目分析,打代码时切记要照着这思路梳理和思路分析一步步打下去,打到最后你就会惊奇的发现————诶?我怎么把程序打出来了? 心得也是很重要的!
阅读全文
0 0
- 花生采摘
- 花生采摘
- 花生采摘
- 花生采摘
- 花生采摘
- 花生采摘
- 花生采摘
- 花生采摘
- 花生采摘
- 花生采摘
- 花生采摘
- 花生采摘
- Noip2004P2 花生采摘
- [洛谷1086]花生采摘
- 洛谷 P1086 花生采摘
- 花生采摘-洛谷 1086
- P1086 花生采摘
- codeves天梯 花生采摘
- 遇到的报错
- 校oj200——带结构体的分数归并排序+字典序人名
- mybatis框架学习(一)之简单搭建环境
- sas3ircu工具信息收集及磁盘定位
- matlab cell
- 花生采摘
- 关于Html下拉输入菜单的几个插件
- #include<cstdlib>的解释
- LeetCode-- Convert Sorted List to Binary Search Tree
- spring cloud 浅析分布式事务
- 自己编写第一个属于自己的网站
- 基础练习 特殊回文数
- 商品管理模块开发
- Node.JS 使用 Express 创建 Node.js Web 项目