蓝桥杯 5. 交换瓶子

交换瓶子

原题目链接

题目描述

N 个瓶子,编号为 1 ~ N,放在架子上。

例如有 5 个瓶子,当前排列为:

in 复制代码
2 1 3 5 4

每次可以拿起 2 个瓶子,交换它们的位置

要求通过若干次交换,使得瓶子的编号从小到大排列为:

out 复制代码
1 2 3 4 5

对于简单情况,显然至少需要交换 2 次就能复位。

如果瓶子更多呢?请你编程解决这个问题,找出最少交换次数


输入描述

输入格式为两行:

  • 第一行:一个正整数 N (N < 10⁴),表示瓶子的数目;
  • 第二行:N 个正整数,空格分隔,表示当前瓶子的排列情况。

输出描述

输出一行一个正整数,表示至少交换多少次,才能完成排序。


输入输出样例

示例

输入

in 复制代码
5
3 1 2 5 4

输出

out 复制代码
3

c++代码

cpp 复制代码
#include<bits/stdc++.h>

using namespace std;

int N, ans = 0;

int main() {
    cin >> N;
    vector<int> root(N);
    for (int i = 0; i < N; i++) cin >> root[i];
    for (int i = 0; i < N; i++) {
        while(root[i] != i + 1) {
            swap(root[i], root[root[i] - 1]);
            ans++;
        }
    }
    cout << ans;
    return 0;
}//by wqs

题目解析

贪心算法

我们假设当前的值不对应

说明我们一定要交换

我们要交换次数最小,就要这次交换的利益最大。

如果我们交换一次刚好和可以让两个数同时对应,这样利益最大,贪心的做法也就是和对应值交换

为什么呢,因为这样既可以保证至少有一个可以对应,还有机会可以对应两个。

例如

3 1 2 5 4

1 2 3 4 5

3和1不同,第一个和第三个交换,至少3对应了。

2 1 3 5 4

1 2 3 4 5

2 1 不同,第二个和第一个交换,1和2都对应了。

1 2 3 5 4

1 2 3 4 5

相关推荐
小七rrrrr6 分钟前
动态规划法 - 53. 最大子数组和
java·算法·动态规划
code小毛孩11 分钟前
leetcodehot100 矩阵置零
算法
一支闲人12 分钟前
C语言相关简单数据结构:双向链表
c语言·数据结构·链表·基础知识·适用于新手小白
何妨重温wdys20 分钟前
矩阵链相乘的最少乘法次数(动态规划解法)
c++·算法·矩阵·动态规划
重启的码农21 分钟前
ggml 介绍 (6) 后端 (ggml_backend)
c++·人工智能·神经网络
重启的码农22 分钟前
ggml介绍 (7)后端缓冲区 (ggml_backend_buffer)
c++·人工智能·神经网络
姜不吃葱32 分钟前
【力扣热题100】双指针—— 接雨水
数据结构·算法·leetcode·力扣热题100
PineappleCoder37 分钟前
大小写 + 标点全搞定!JS 如何精准统计单词频率?
前端·javascript·算法
雨落倾城夏未凉41 分钟前
5.通过拷贝构造函数复制一个对象,假如对象的成员中有个指针类型的变量,如何避免拷贝出来的副本中的该成员之下行同一块内存(等价于默认拷贝构造函数有没有缺点)
c++·后端
雨落倾城夏未凉43 分钟前
4.深拷贝VS浅拷贝
c++·后端