题目意思:
在一片菜地里,种了花生,有个人戴了只猴子从路边走过,人希望猴子依次从花生最多的点采花生,但必须在规定时间内赶回主人身边,问你最多可以采摘到多少花生。每走动一格,花费一个单位的时间。同时, 在某点采花生,也花费一个单位的时间。
解答:
1、花生排序之后(按 花生的数量,x坐标,y坐标), 每取一点的花生,要计算回到路上的时间是否足够
2、简单的模拟,水题
#include <cstdio>
#include <cstring>
#include <iostream>
#include <cmath>
#include <algorithm>
using namespace std;
const int MaxL = 2510;
struct Peanut
{
int x, y;
int cnt;
}peanuts[MaxL];
bool cmp(const Peanut& a, const Peanut& b)
{
if(a.cnt != b.cnt)
{
return a.cnt > b.cnt;
}else if(a.x != b.x){
return a.x < b.x;
}else{
return a.y < b.y;
}
}
int p_num; // 有 peanut 的点的总数
int t, m, n, k;
void solve()
{
sort(peanuts, peanuts + p_num, cmp);
int ans = 0, time;
if(peanuts[0].x * 2 + 1 > k) //花费的总时间大于 k
{
printf("0\n");
return;
}
ans += peanuts[0].cnt;
time = 1 + peanuts[0].x;
for(int i = 1; i < p_num; ++i)
{
if(time + abs(peanuts[i].x - peanuts[i - 1].x) + abs(peanuts[i].y - peanuts[i - 1].y) + 1
+ peanuts[i].x <= k)
{
ans += peanuts[i].cnt;
time += abs(peanuts[i].x - peanuts[i - 1].x) + abs(peanuts[i].y - peanuts[i - 1].y) + 1;
}else{
break;
}
}
printf("%d\n", ans);
}
int main()
{
scanf("%d", &t);
int a;
while(t--)
{
p_num = 0;
scanf("%d%d%d", &m, &n, &k);
for(int i = 1; i <= m; ++i)
{
for(int j = 1; j <= n; ++j)
{
scanf("%d", &a);
if(a)
{
peanuts[p_num].x = i, peanuts[p_num].y = j;
peanuts[p_num++].cnt = a;
}
}
}
solve();
}
return 0;
}
/*
2
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
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 0
*/
/*
37
28
*/