交换-2020年牛客算法入门课练习赛1

链接:https://ac.nowcoder.com/acm/contest/5773/E
来源:牛客网

题目描述
牛客幼儿园的小朋友课间操时间需要按照学号从小到大排队,但是他们太小了只能站成一列顺序却不对,现在幼儿园的阿姨需要帮忙交换小朋友的位置让他们最终有序,阿姨希望能尽快完成交换操作,问最少需要交换多少次,才能使得小朋友们从小到大排好。
注意:每个小朋友的学号不同,但是未必连续,因为可能有小朋友请假了没有来。
输入描述:
第一行一个整数 N。
接下来 N 行每行一个整数,为小朋友们的队列。
输出描述:
一个整数表示小朋友们的最小交换次数。
示例1
输入
复制
3
2
1
3
输出
复制
1

有个隐藏条件,因为是学号,所以不会有相同数字。
任意两数都可以交换位置,最多交换n-1次就能有序。
这是一个查找问题,定义a数组为原有序列,b数组为排序之后序列,如果a和b同一位置数字相同不交换,ai和bi不相同我们要在a中找到bi的位置,然后交换。因此提前用map记录好每个值在a数组中的下标。注意交换后要更新map中位置信息。

#include <bits/stdc++.h>
typedef long long ll;
using namespace std;
int a[100005],b[100005],n;
map<int,int>m1;
int main()
{
    ios::sync_with_stdio(0),cin.tie(0);
    int i,j,ans=0;
    cin>>n;
    for(i=1;i<=n;i++)
    {
        cin>>a[i];
        m1[a[i]]=i; /**< 记录下每个值的具***置,方便后面查找 */
        b[i]=a[i];
    }
    sort(b+1,b+n+1);
    for(i=1;i<=n;i++)
    {
        if(b[i]!=a[i]) /**< 需要交换,第i个位置应该是b[i] */
        {
            m1[a[i]]=m1[b[i]]; /**< a[i]的位置换到a数组中b[i]哪里 */
            swap(a[i],a[m1[b[i]]]); /**< a数组两值交换 */
            ans++;
        }
    }
    cout<<ans<<endl;
    return 0;
}
全部评论

相关推荐

预计下个星期就能开奖吧,哪位老哥来给个准信
华孝子爱信等:对接人上周说的是这周
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务