本文主要是介绍[蓝桥杯 2016 省 B] 交换瓶子,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
题目链接
[蓝桥杯 2016 省 B] 交换瓶子
题目描述
有 N N N 个瓶子,编号 1 ∼ N 1∼N 1∼N,放在架子上。
比如有 5 5 5 个瓶子:
2,1,3,5,4
要求每次拿起 2 2 2 个瓶子,交换它们的位置。
经过若干次后,使得瓶子的序号为:
1,2,3,4,5
对于这么简单的情况,显然,至少需要交换 2 2 2 次就可以复位。
如果瓶子更多呢?你可以通过编程来解决。
输入格式
第一行:一个正整数 N N N,表示瓶子的数目。
第二行: N N N 个正整数,用空格分开,表示瓶子目前的排列情况。
输出格式
输出数据为一行一个正整数,表示至少交换多少次,才能完成排序。
输入输出样例
输入
5
3 1 2 5 4
输出
3
输入
5
5 4 3 2 1
输出
2
数据范围
- N ≤ 10000 N \leq 10000 N≤10000
解法:贪心
对于 a [ i ] a[i] a[i] :
-
如果 a [ i ] a[i] a[i] 在其正确的位置上,即 a [ i ] = i a[i] = i a[i]=i,那就跳过;
-
对于 a [ i ] a[i] a[i] 不在它正确的位置上,即 a [ i ] ≠ i a[i] \neq i a[i]=i,就要从 [ i + 1 , n ] [i + 1, n] [i+1,n] 中找到元素 i i i 的位置 j j j,即 a [ j ] = i a[j] = i a[j]=i。此时需要交换 ( a [ i ] , a [ j ] ) (a[i], a[j]) (a[i],a[j]),交换次数加一。
时间复杂度: O ( n 2 ) O(n^2) O(n2)
C++代码:
#include <iostream>
#include <cstring>
#include <vector>
#include <functional>
#include <unordered_set>
#include <set>
#include <algorithm>using namespace std;
using LL = long long;void solve(){int n;cin>>n;vector<int> a(n + 5);for(int i = 1;i <= n;i++) cin>>a[i];int ans = 0;for(int i = 1;i <= n;i++){if(a[i] != i) //不在正确的位置上,需要交换{ans++;for(int j = i + 1;j <= n;j++){if(a[j] == i){swap(a[i], a[j]);break;}}}}cout<<ans<<'\n';}int main(){int t = 1;//cin>>t;while(t--){solve();}return 0;
}
Java代码:
import java.io.*;
import java.util.*;public class Main
{static BufferedReader in = new BufferedReader(new InputStreamReader(System.in));public static void main(String[] args) throws Exception{int n = Integer.parseInt(in.readLine().trim());String[] str = in.readLine().split(" ");int[] a = new int[n + 5];for(int i = 0;i < n;i++){a[i + 1] = Integer.parseInt(str[i]);}int ans = 0;for(int i = 1;i <= n;i++){if(a[i] != i){ans++;for(int j = i + 1;j <= n;j++){if(a[j] == i){int temp = a[i];a[i] = a[j];a[j] = temp;break;}}}}System.out.println(ans);}
}
这篇关于[蓝桥杯 2016 省 B] 交换瓶子的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!