grids 2950 摘花生

[*][size=large]题意[/size]

中文的不解释

[*][size=large]思路[/size]

这是一道模拟题,根据查找的步骤,一次次判断能否走到,能则走,不能则结束
查找的方法为:查出为采摘的花生数量最多的,判断能否走到,并采摘,并回到路。能则进行走到那里,并采摘,不能则结束。

[*][size=large]总结[/size]

要细心,包括以下注意的:
(1)第一次采摘能不能成功的
(2)判断能否成功还需要将返回路的计算进去
(3)采摘需要消耗一个时间

[*][size=large]代码[/size]

I.方法一
直接每次都求出最大值,这种方法的时间复杂度为O(N^2)

(1)C


#include "stdio.h"
#include "stdlib.h"
#include "math.h"
#define MAX 50
int p[MAX+2][MAX+2];
int main()
{
int t;//case times
int m,n,k;//m*n field,k times
int i,j;//loop tmp
int sum;
int max,tmpi,tmpj,tmpii,tmpjj;
scanf("%d",&t);
while(t--)
{
sum=0;
scanf("%d%d%d",&m,&n,&k);
for(i=0;i<m;i++){ for(j=0;j<n;j++){ scanf("%d",&p[i][j]); }}
max = -1;
for(i=0;i<m;i++){for(j=0;j<n;j++){if(max<p[i][j]){max=p[i][j];tmpi=i;tmpj=j;}}}
if(max==0 || k<(tmpi+1)*2 + 1){printf("0\n");}
else
{
k -= (tmpi+1)+1;
sum += max;
p[tmpi][tmpj] = 0;
tmpii = tmpi;tmpjj = tmpj;
max = -1;
for(i=0;i<m;i++){for(j=0;j<n;j++){if(max<p[i][j]){max=p[i][j];tmpi=i;tmpj=j;}}}
while((k >= abs(tmpii-tmpi) + abs(tmpjj-tmpj) + tmpi + 1 + 1) && (max != 0))
{
k -= (abs(tmpii-tmpi) + abs(tmpjj-tmpj) + 1);
sum += max;
p[tmpi][tmpj] = 0;
tmpii = tmpi;tmpjj = tmpj;
max = -1;
for(i=0;i<m;i++){for(j=0;j<n;j++){if(max<p[i][j]){max=p[i][j];tmpi=i;tmpj=j;}}}
//printf("max=%d,sum=%d,k=%d,kk=%d\n",max,sum, k,abs(tmpii-tmpi) + abs(tmpjj-tmpj) + tmpi + 1);
}
printf("%d\n",sum);
}
}
//system("pause");
return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值