2 条题解
-
5
题解
这道题我们可以把花生矩阵变成一个记录着某某位置多少花生的列表,然后按花生多少排序,然后遍历这个列表就是最先去更大的花生位置了。
然后规划前往的路线长度,如果时间足够多多采完花生返回,则取采。否则直接回来。如果所有花生都采完了也结束。
#include <bits/stdc++.h> using namespace std; int n, m, k, tim, fx, fy, ex, ey, pn, ans; int mp[55][55]; struct dire { int x, y, sum; } stu[55 * 55]; bool cmp(dire a, dire b) // 比较 { return a.sum > b.sum; } int main() { scanf("%d%d%d", &n, &m, &k); for (int i = 1; i <= n; i++) { for (int j = 1; j <=m ; j++) { scanf("%d", &mp[i][j]); if (mp[i][j] > 0) // 记录非空的花生 { stu[++pn].sum = mp[i][j]; stu[pn].x = i; stu[pn].y = j; } } } sort(stu + 1, stu + pn + 1, cmp); // 排序 // 花一个时间到达第一行,我们为了节省到达第一个花生点的时间,直接到达第一个花生那一列。 fx = 1; fy = stu[1].y; k--; for (int i = 1; i <= pn; i++) // 遍历所有花生 { ex = stu[i].x; ey = stu[i].y; tim = abs(fx - ex) + abs(fy - ey); k--; k -= tim; if (k >= ex) // 如果剩下的时间够返回路上, { // 去那里采花生 // 注:前面k--已经去除了采摘的时间 ans += mp[ex][ey]; fx = ex; fy = ey; } else // 如果不够, { // 直接回去 printf("%d\n", ans); return 0; } } printf("%d\n", ans); // 全部采完 return 0; }
#include <bits/stdc++.h> using namespace std; int n, m, k, tim, fx, fy, ex, ey, pn, ans; int mp[55][55]; struct dire { int x, y, sum; } stu[55 * 55]; bool cmp(dire a, dire b) { return a.sum > b.sum; } int main() { scanf("%d%d%d", &n, &m, &k); for (int i = 1; i <= n; i++) { for (int j = 1; j <=m ; j++) { scanf("%d", &mp[i][j]); if (mp[i][j] > 0) { stu[++pn].sum = mp[i][j]; stu[pn].x = i; stu[pn].y = j; } } } sort(stu + 1, stu + pn + 1, cmp); fx = 1; fy = stu[1].y; k--; for (int i = 1; i <= pn; i++) { ex = stu[i].x; ey = stu[i].y; tim = abs(fx - ex) + abs(fy - ey); k--; k -= tim; if (k >= ex) { ans += mp[ex][ey]; fx = ex; fy = ey; } else { printf("%d\n", ans); return 0; } } printf("%d\n", ans); return 0; }
-
1
#include <bits/stdc++.h> using namespace std; int m,n,k=1,t,u,ans; struct T{ int x,y,time,w; }p[1000001];//结构体 int a[1010][1010]; int main(){ cin>>m>>n>>t; for (int i=1;i<=m;i++){ for (int j=1;j<=n;j++){ cin>>a[i][j]; if(a[i][j]>0){ p[k].w=a[i][j]; p[k].x=i; p[k].y=j; k++; }//如果有数据就加上 } } for (int i=1;i<k;i++){ for (int j=i+1;j<=k;j++){ if(p[i].w<p[j].w){ swap(p[i],p[j]); } } }//排序 for (int i=1;i<=k;i++){ u=p[i].x; if(i==1){ p[i].time=p[i].x+1; } else{ p[i].time=p[i-1].time+abs(p[i].x-p[i-1].x)+abs(p[i].y-p[i-1].y)+1; }//计算时间 if (p[i].time+u<=t){ ans+=p[i].w; }//时间够就加上 } cout<<ans; return 0; }
- 1
信息
- ID
- 479
- 时间
- 1000ms
- 内存
- 128MiB
- 难度
- 4
- 标签
- 递交数
- 176
- 已通过
- 87
- 上传者