花生采摘
发布日期:2021-05-07 06:56:09 浏览次数:20 分类:精选文章

本文共 1613 字,大约阅读时间需要 5 分钟。

为了解决这个问题,我们需要找到一种方法,让多多在限定时间内尽可能多地采摘花生。多多只能从路边跳到相邻的花生植株,并采摘花生。每次移动和采摘都需要时间,我们需要优化采摘顺序以在限定时间内采摘最多的花生。

方法思路

  • 收集花生数据:首先读取花生田的大小和花生分布,记录所有有花生的植株及其花生数量。
  • 排序植株:将这些有花生的植株按花生数量从高到低排序,以便优先采摘花生最多的植株。
  • 计算时间:从路边到每个目标位置的移动时间包括水平和垂直移动的时间,再加上采摘花生的时间。确保总时间不超过限定时间K。
  • 采摘顺序:依次处理排序后的植株,计算每次移动和采摘所需的时间,直到时间用尽或所有植株都被采摘。
  • 解决代码

    #include 
    #include
    #include
    using namespace std;int main() { int M, N, K; scanf("%d %d %d", &M, &N, &K); vector
    > a(M + 1, vector
    (N + 1, 0)); for (int i = 1; i <= M; ++i) { int row_sum = 0; scanf("%d", &a[i][1]); for (int j = 2; j <= N; ++j) { int num; scanf("%d", &num); a[i][j] = row_sum + num; row_sum += num; } } vector
    > positions; vector
    nums; for (int i = 1; i <= M; ++i) { for (int j = 1; j <= N; ++j) { if (a[i][j] > 0) { positions.push_back(make_pair(i, j)); nums.push_back(a[i][j]); } } } sort(positions.begin(), positions.end(), [&nums](int i, int j) { return nums[i-1] > nums[j-1]; }); int ans = 0; int current_time = 0; int prev_i = 1; int prev_j = 1; for (int p = 0; p < positions.size(); ++p) { int i = positions[p].first; int j = positions[p].second; int num = nums[p]; int dx = abs(i - prev_i); int dy = abs(j - prev_j); int total = current_time + dx + dy + 1; if (total <= K) { ans += num; current_time = total; prev_i = i; prev_j = j; } } cout << ans << endl; return 0;}

    代码解释

  • 读取输入:读取花生田的大小M和N,以及限定时间K。
  • 初始化花生分布:使用二维数组存储花生分布数据。
  • 收集有花生的植株:遍历花生田,记录所有有花生的植株及其花生数量。
  • 排序植株:按花生数量从高到低排序,以便优先采摘。
  • 计算时间和采摘顺序:从路边开始,依次处理排序后的植株,计算移动和采摘所需的时间,确保总时间不超过K。
  • 输出结果:输出在限定时间内最多采摘的花生数量。
  • 上一篇:FBI树
    下一篇:文化之旅

    发表评论

    最新留言

    感谢大佬
    [***.8.128.20]2025年04月08日 21时43分02秒