1 条题解

  • 2
    @ 2024-6-12 18:33:02

    题目意思

    给你一个数组,并给出他们的入队顺序,求最少要进行几次交换位置,才能完成从小到大排序的要求。

    解题思路

    模拟入队的顺序,每一次都排一下序。因为每次最新入队的都是在最后面,所以就从后到前遍历,遇到比他大的就交换一下。

    但是前面的都是相同的怎么办?

    那我们再设一个变量,从要交换的元素开始,如果他的前一个与他相同,那就指向前一个,直到前一个不同或到达第一个为止。再把这个变量指向的值与最新的值交换。

    如果最新的值前面的都比他小或相等,直接退出该循环。

    参考代码:

    #include<bits/stdc++.h>
    using namespace std;
    int a[2010],b[2010];
    int main()
    {
    	int n,m;
    	cin>>n;
    	for(int i=0;i<n;i++)
    		cin>>a[i];
    	cin>>m;
    	for(int i=1;i<=m;i++)
    	{
    		int x,s=0;
    		cin>>x;
    		b[i]=a[x];//更新最后的值
    		for(int j=i-1;j>=1;j--)
    			if(b[j]>b[j+1])
    			{
    				int x=j;
    				while(x>1&&b[x-1]==b[x])x--;//如果与前一个相等,则指向前一个
    				swap(b[x],b[j+1]);//交换
    				j=x;//j也要指向最新值
    				s++;//计数器+1
    			}
    			else 
    				break;//退出该循环
    		cout<<s<<endl;
    	}
    	return 0;
    }
    
    • 1

    [GESP样题 五级] 小杨的队列

    信息

    ID
    659
    时间
    1000ms
    内存
    512MiB
    难度
    5
    标签
    递交数
    32
    已通过
    16
    上传者