21xrx.com
2024-11-10 00:24:51 Sunday
登录
文章检索 我的文章 写文章
C++分西瓜:让你轻松了解STL中的容器和算法
2023-06-29 17:48:28 深夜i     --     --
C++ STL 容器 算法 西瓜分割

C++是一种广泛使用的编程语言,也是计算机科学领域最受欢迎的语言之一。在C++中,STL(Standard Template Library)是一个非常有用和重要的工具,容器和算法是STL的两个核心部分。本文将通过一个有趣的例子——分西瓜,来让你轻松了解STL中的容器和算法。

首先,我们需要一个容器来装西瓜,STL中有许多种容器,比如vector、list、deque、set等。这里我们选择用vector,因为它支持快速随机访问元素,并且容易使用和维护。

然后,我们需要将西瓜分成若干组,每一组的重量差尽量小。这里涉及到一个经典的算法——贪心算法,在每一次选择中,总是选择当前最优解。所以我们首先需要将西瓜按重量从小到大排序,然后依次选择最轻的西瓜放入不同组中。

最后,我们需要输出每一组的重量和西瓜的编号。这里我们还需要用到STL中的迭代器,它们用于访问容器中的元素,我们可以通过begin()和end()函数来获得一个容器的起始和结束迭代器。

现在让我们看一下完整的代码实现:


#include <iostream>

#include <vector>

#include <algorithm>

using namespace std;

int main() {

  int n, c, w;

  cin >> n >> c;

  vector<pair<int, int>> watermelons(n); // 定义一个pair类型的vector,用于存储西瓜的重量和编号

  for (int i = 0; i < n; i++) {

    cin >> w;

    watermelons[i] = make_pair(w, i + 1); // 将每个西瓜的重量和编号插入vector中

  }

  sort(watermelons.begin(), watermelons.end()); // 按重量从小到大排序

  vector<int> ans[n];

  for (int i = 0; i < n; i++) {

    int minw = watermelons[i].first;

    int minidx = 0;

    for (int j = 0; j < c; j++) {

      if (ans[j].empty() || abs(minw - ans[j][ans[j].size() - 1]) < abs(minw - ans[minidx][ans[minidx].size() - 1]))

        minidx = j;

      

    }

    ans[minidx].push_back(minw); // 将最轻的西瓜放入重量分组最少的组中

  }

  for (int i = 0; i < c; i++) {

    cout << "Group " << i + 1 << ": ";

    for (vector<int>::iterator it = ans[i].begin(); it != ans[i].end(); it++) {

      cout << *it << " ";

    }

    cout << endl;

  }

  return 0;

}

通过这个例子,我们可以看到STL的强大之处,容器和算法使我们的代码更加简洁和易于维护。在实际的开发中,掌握STL的用法将大大提高代码的效率和质量。

  
  
下一篇: C++组合模式

评论区

{{item['qq_nickname']}}
()
回复
回复