沈阳做网站的公司推荐,软文推广代理,免费的网址域名,杭州建网站企业题目描述
鲁宾逊先生有一只宠物猴#xff0c;名叫多多。这天#xff0c;他们两个正沿着乡间小路散步#xff0c;突然发现路边的告示牌上贴着一张小小的纸条#xff1a;“欢迎免费品尝我种的花生#xff01;――熊字”。
鲁宾逊先生和多多都很开心#xff0c;因为花生正…题目描述
鲁宾逊先生有一只宠物猴名叫多多。这天他们两个正沿着乡间小路散步突然发现路边的告示牌上贴着一张小小的纸条“欢迎免费品尝我种的花生――熊字”。
鲁宾逊先生和多多都很开心因为花生正是他们的最爱。在告示牌背后路边真的有一块花生田花生植株整齐地排列成矩形网格如图11。有经验的多多一眼就能看出每棵花生植株下的花生有多少。为了训练多多的算术鲁宾逊先生说“你先找出花生最多的植株去采摘它的花生然后再找出剩下的植株里花生最多的去采摘它的花生依此类推不过你一定要在我限定的时间内回到路边。” 我们假定多多在每个单位时间内可以做下列四件事情中的一件 从路边跳到最靠近路边即第一行的某棵花生植株 从一棵植株跳到前后左右与之相邻的另一棵植株 采摘一棵植株下的花生 从最靠近路边即第一行的某棵花生植株跳回路边。
现在给定一块花生田的大小和花生的分布请问在限定时间内多多最多可以采到多少个花生注意可能只有部分植株下面长有花生假设这些植株下的花生个数各不相同。
例如在图2所示的花生田里只有位于(2, 5), (3, 7), (4, 2), (5, 4)(2,5),(3,7),(4,2),(5,4)的植株下长有花生个数分别为13, 7, 15, 913,7,15,9。沿着图示的路线多多在2121个单位时间内最多可以采到3737个花生。
Tips在采摘过程中不能回到路边哦。
输入格式
第一行包括三个整数M, NM,N和KK用空格隔开表示花生田的大小为M \times N(1 \le M, N \le 20)M×N(1≤M,N≤20)多多采花生的限定时间为K(0 \le K \le 1000)K(0≤K≤1000)个单位时间。接下来的MM行每行包括NN个非负整数也用空格隔开第i 1i1行的第jj个整数P_{ij}(0 \le P_{ij} \le 500)Pij(0≤Pij≤500)表示花生田里植株(i, j)(i,j)下花生的数目00表示该植株下没有花生。
输出格式
一个整数即在限定时间内多多最多可以采到花生的个数。
输入数据 1
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 0Copy
输出数据 1
37Copy
输入数据 2
6 7 20
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 0Copy
输出数据 2
28Copy
来源
NOIP 2004 普及组 第二题 代码:
#includeiostream
#includemap
#includecmath
#includealgorithm
#includequeue
using namespace std;
struct Node{int x,y;int w;
}q[500];//结构体记录有花生的地方以及其价值
int s[25][25];
bool cmp(Node xx,Node yy){return xx.wyy.w;
}
int main(){int n,m,t,ans0,k0;//ans记录答案k记录有多少个有花生的点cinnmt;for(int i1;in;i){for(int j1;jm;j){cins[i][j];if(s[i][j]0){k;q[k].xi;q[k].yj;q[k].ws[i][j];}}}sort(q1,q1k,cmp);//按照花生价值从大到小将结构体排序for(int i1;;i){if(i1){if(t-(2*q[i].x1)0){ansq[i].w;t-(q[i].x1);}else{break;}}//i1是只需要走直线判断若其进去采摘后可走出则进入采摘否则结束if(i1){if((abs(q[i].x-q[i-1].x)abs(q[i].y-q[i-1].y)1q[i].x)t){ansq[i].w;t-(abs(q[i].x-q[i-1].x)abs(q[i].y-q[i-1].y)1);}else{break;}}//i1时用曼哈顿距离判断其从上一点到下一点所花费的时间再加上其采摘和出去的时间若在规定时间内则采摘否则结束}coutans;return 0;
}