标签:inline 输入 code 定时 scan 记录 family 无法 while
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
解题思路:
1.找到第一个最大数
2.判断能不能回去,计算一下时间:xx+xx+1并判断2xx+1是不是要小于k
3.记录总数sum=sum+花生的数
4.将a[i][j]=0;
5.记录下一位置:zx,zy
距离为abs(zx-xx)+abs(zy-yy)
思路分析:看完上面的过程简要分析后就知道每一次找花生都是先找最大值,判断采摘时间是否足够(要加上回去的时间)
,如果够,就摘;不够,就回去。(不用担心回不去,因为采摘这株花生的时候条件已经满足,至少已经是可以回去的了)。
那么简要分析后,就知道采摘第一株花生是要特判的,因为第一株花生是可以从路边任意位置开始,找到最大值后与它的距离为x,
再加上采摘时间1,再加上回去时间x,所以第一次采摘花生的特判时间就为(2x+1)。接下来每次就是找到最大值,
判断时间,采摘……知道时间不够用了或花生已经被采完了为止为止。
AC代码:
#pragma GCC optimize(2) #include<bits/stdc++.h> using namespace std; inline int read() {int x=0,f=1;char c=getchar();while(c!=‘-‘&&(c<‘0‘||c>‘9‘))c=getchar();if(c==‘-‘)f=-1,c=getchar();while(c>=‘0‘&&c<=‘9‘)x=x*10+c-‘0‘,c=getchar();return f*x;} typedef long long ll; const int maxn=1000; const int M=1e7+10; const int INF=0x3f3f3f3f; int n,m,k; int max1,sum=0; int a[maxn][maxn]; int xx,yy,zx,zy; void find(){//寻找最大值 max1=0; for(int i=1;i<=n;i++){ for(int j=1;j<=m;j++){ if(a[i][j]>max1){ max1=a[i][j]; xx=i;yy=j; } } } } int main() { cin>>n>>m>>k; for(int i=1;i<=n;i++){ for(int j=1;j<=m;j++){ scanf("%d",&a[i][j]); } } find();//第一次 if(2*xx+1<=k){ sum+=max1; a[xx][yy]=0;//采摘完的 k=k-xx-1; zx=xx;zy=yy;//记录下一个 } else{ printf("0\n"); return 0; } int l; while(k>0){ find(); a[xx][yy]=0; if(max1==0)break;//最大花生为0,说明没花生了 l=abs(zx-xx)+abs(zy-yy)+1; if(l+xx>k)break;//无法采摘(回不去) sum+=max1; k-=l; zx=xx,zy=yy; } printf("%d\n",sum); return 0; }
标签:inline 输入 code 定时 scan 记录 family 无法 while
原文地址:https://www.cnblogs.com/lipu123/p/12210141.html