返回

7-4 胖达与盆盆奶剖析:公平分配,和谐吃奶

闲谈

在算法竞赛的世界里,PTA 7-4 胖达与盆盆奶是一道经典且具有代表性的题目。这道题乍看之下似乎简单,但实际上却蕴含着不少算法思想和数据结构的知识。

题目背景

胖达,俗称“胖达”,会排队吃盆盆奶。它们能和谐吃奶的前提,是它们认为盆盆奶的分配是“公平”的,即:更胖的胖达能吃到更多的奶,等胖的胖达得吃到一样多的奶。另一方面,因为它们是排好队的,所以每只胖达只能吃前面的那只胖达剩下的奶。

算法思路

这道题的算法思想主要基于贪心算法。所谓贪心算法,是一种在每一步选择当前看起来最优的方案的算法。在这个题目中,我们希望让每只胖达都吃到尽可能多的奶,因此,我们可以在每一步选择分配奶最多的胖达。

数据结构

这道题的数据结构选择非常重要。由于我们需要记录每只胖达吃的奶量,并且需要根据胖达的胖瘦排序,因此,可以使用一个结构体数组来存储胖达的信息。

typedef struct panda {
    int weight;  // 胖达的体重
    int milk;   // 胖达吃的奶量
} Panda;

算法实现

算法的实现步骤如下:

  1. 根据胖达的体重对胖达进行排序,体重大的排在前面。
  2. 遍历胖达数组,依次分配奶量。每只胖达分配的奶量为前面的胖达剩下的奶量。
  3. 输出每只胖达吃的奶量。

示例代码

#include <iostream>
#include <algorithm>
using namespace std;

const int MAXN = 100;

int main() {
    int n;
    cin >> n;
    Panda pandas[MAXN];
    for (int i = 0; i < n; i++) {
        cin >> pandas[i].weight;
        pandas[i].milk = 0;
    }
    sort(pandas, pandas + n, [](const Panda &a, const Panda &b) { return a.weight > b.weight; });
    for (int i = 0; i < n; i++) {
        if (i == 0) {
            pandas[i].milk = pandas[i].weight;
        } else {
            pandas[i].milk = pandas[i - 1].milk + pandas[i].weight;
        }
    }
    for (int i = 0; i < n; i++) {
        cout << pandas[i].milk << endl;
    }
    return 0;
}

总结

PTA 7-4 胖达与盆盆奶是一道经典的算法题,它涉及到贪心算法思想和数据结构的选择。通过对这道题的分析和实现,我们可以深入理解算法的精髓,为解决更复杂的问题奠定基础。