赞
踩
鲁宾逊先生有一只宠物猴,名叫多多。这天,他们两个正沿着乡间小路散步,突然发现路边的告示牌上贴着一张小小的纸条:“欢迎免费品尝我种的花生!——熊字”。
鲁宾逊先生和多多都很开心,因为花生正是他们的最爱。在告示牌背后,路边真的有一块花生田,花生植株整齐地排列成矩形网格(如图1)。有经验的多多一眼就能看出,每棵花生植株下的花生有多少。为了训练多多的算术,鲁宾逊先生说:“你先找出花生最多的植株,去采摘它的花生;然后再找出剩下的植株里花生最多的,去采摘它的花生;依此类推,不过你一定要在我限定的时间内回到路边。”
我们假定多多在每个单位时间内,可以做下列四件事情中的一件:
输入
输入的第一行包括一个整数T,表示数据组数
每组输入的第一行包括三个整数,M, N和K,用空格隔开;表示花生田的大小为M * N(1 <= M, N <= 50),多多采花生的限定时间为K(0 <= K <= 1000)个单位时间。接下来的M行,每行包括N个非负整数,也用空格隔开;第i + 1行的第j个整数Pij(0 <= Pij <= 500)表示花生田里植株(i, j)下花生的数目,0表示该植株下没有花生。
输出
输出包括T行,每一行只包含一个整数,即在限定时间内,多多最多可以采到花生的个数。
样例输入
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
思路:对于每一个有花生的点,有三种状态:
三种状态对应三种结果:
代码:
#include<iostream> #include<algorithm> #include<cmath> using namespace std; struct points {//定义采集点的结构体 int x, y, num;// x y 坐标,以及花生数 }; bool comp(points a, points b) {//将采集点按花生数的多少进行排序 return (a.num > b.num); } int walk(points a, points b) {//两采集点间的距离 return (abs(a.x - b.x) + abs(a.y - b.y)); } int main() { int T; cin >> T; points p[2502];//花生园 int h, l, steps;//行数,列数,步数 int numbers;//花生数目 while (T--) { cin >> h >> l >> steps; for (int i = 0; i < h; i++) { for (int j = 0; j < l; j++) { cin >> p[i*l + j + 1].num; p[i*l + j + 1].x = i + 1; p[i*l + j + 1].y = j + 1; } } sort(p + 1, p + h * l + 1, comp);//按花生数目,从大到小排序采集点 p[0].x = 0; p[0].y = p[1].y;//起点 p[h*l + 1].x = 0; p[h*l + 1].y = p[h*l].y;//终点(可能提前结束) numbers = 0; int tem = steps - walk(p[0], p[1]) - 1;//走到第一个采集点后剩余步数 for (int i = 1; i <= h * l; i++) { if (p[i].num == 0)break;//之后的采集点没花生,跳过 if (tem < p[i].x) {//回不到路边 numbers = 0; break; } else if (tem < p[i + 1].x + 1 + walk(p[i], p[i + 1])) {//下一采集点回不到路边 numbers += p[i].num; break; } else {//下一采集点能回到路边,去往下一采集点 numbers += p[i].num; tem -= (walk(p[i], p[i + 1]) + 1); } } cout << numbers << endl; } }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。