贪心猫的鱼干大分配

59 阅读2分钟

问题解析

问题描述

在猫星球上,小R负责给一行排队的猫分发鱼干。每只猫有一个等级,等级越高的猫应该得到更多的鱼干。规则如下:

  1. 每只猫至少得到一斤鱼干。
  2. 如果一只猫的等级高于它相邻的猫,它就应该得到比相邻的猫更多的鱼干。 小R想知道,为了公平地满足所有猫的等级差异,他至少需要准备多少斤鱼干。 好的,下面是一个快速排序(Quick Sort)算法的实现。快速排序是一种高效的排序算法,它通过选择一个“基准”元素,将数组分为两部分,一部分小于基准,一部分大于基准,然后递归地对这两部分进行排序。

快速排序算法步骤

  1. 选择基准元素:从数组中选择一个元素作为基准(pivot)。通常选择第一个或最后一个元素。
  2. 分区操作:将数组分为两部分,一部分小于基准,一部分大于基准。
  3. 递归排序:对分区的两部分分别递归地进行快速排序。

代码实现

#include <iostream>
#include <vector>

// 分区函数,返回基准元素的最终位置
int partition(std::vector<int>& arr, int low, int high) {
    int pivot = arr[high];  // 选择最后一个元素作为基准
    int i = low - 1;  // i 是小于基准的元素的最后一个位置

    for (int j = low; j < high; j++) {
        if (arr[j] < pivot) {
            i++;
            std::swap(arr[i], arr[j]);
        }
    }
    std::swap(arr[i + 1], arr[high]);  // 将基准元素放到正确的位置
    return i + 1;
}

// 快速排序函数
void quickSort(std::vector<int>& arr, int low, int high) {
    if (low < high) {
        int pi = partition(arr, low, high);  // 获取分区点

        // 递归排序分区后的两部分
        quickSort(arr, low, pi - 1);
        quickSort(arr, pi + 1, high);
    }
}

int main() {
    std::vector<int> arr = {10, 7, 8, 9, 1, 5};
    int n = arr.size();

    quickSort(arr, 0, n - 1);

    std::cout << "Sorted array: ";
    for (int i = 0; i < n; i++) {
        std::cout << arr[i] << " ";
    }
    std::cout << std::endl;

    return 0;
}

代码解释

  1. partition函数:负责将数组分区,并返回基准元素的最终位置。
  2. quickSort函数:递归地对数组进行排序。
  3. main函数:测试快速排序算法。

时间复杂度

  • 最坏情况O(n^2),当每次选择的基准元素都是最大或最小值时。
  • 平均情况O(n log n),通常情况下快速排序表现良好。