链接:https://ac.nowcoder.com/acm/contest/61132/F 来源:牛客网 松鼠宝宝有一排n个大小不一的坚果,松鼠宝宝想把坚果从小到大排序,每次他会选择两个坚果a和b每次花费1点力气把这两个坚果交换,爱动脑筋的松鼠宝宝想知道他排完这n个坚果一共需要花费的最少力气是多少? 输入描述: 第一行一个整数n代表坚果数 接下来一行n个整数代表每个坚果的大小(每个坚果大小都不一样,即大小为1-n的一个排列) 1<=n<=1e5 坚果大小x,1<=x<=n 输出描述: 一行输出代表松鼠宝宝花费的最小力气 用C++代码写
时间: 2024-04-13 07:26:27 浏览: 89
这个问题可以使用贪心算法来解决。我们观察到,每次交换两个坚果的时候,会将一个较小的坚果放到前面,一个较大的坚果放到后面。因此,为了使总的交换次数最少,我们可以从最后一个坚果开始,依次将当前最大的坚果交换到正确的位置上。
下面是代码的示例实现:
```cpp
#include <iostream>
#include <vector>
using namespace std;
int minimum_effort(int n, vector<int>& nuts) {
int effort = 0;
for (int i = n - 1; i >= 0; i--) {
if (nuts[i] != i + 1) {
swap(nuts[i], nuts[nuts[i] - 1]);
effort++;
}
}
return effort;
}
int main() {
int n;
cin >> n;
vector<int> nuts(n);
for (int i = 0; i < n; i++) {
cin >> nuts[i];
}
int result = minimum_effort(n, nuts);
cout << result << endl;
return 0;
}
```
这段代码首先读取输入的n,然后读取n个坚果的大小。接下来,调用`minimum_effort`函数来计算松鼠宝宝需要花费的最小力气,并将结果输出。
希望对你有所帮助!如果还有其他问题,请随时提问。
阅读全文