题解:P13257 [GCJ 2014 #2] Up and Down

· · 题解

P13257 题解:

主要思路:

循环处理每次输入的 n 个数,每次处理找这组数中的最小值,将这个最小值放在离它最近的边界处,然后这个数就已经处理好了,将其从数组中删除,同时用一个变量累加每次将最小值放在离它最近的边界的最小交换次数,最后输出这个变量即可。

代码实现:

AC Code:

#include <bits/stdc++.h>
#define int long long
using namespace std;
constexpr int N=1e3+7;
int t,n,a[N];
int32_t main(){
    cin.tie(nullptr)->ios::sync_with_stdio(false);
    cin>>t;
    for(int res=1;res<=t;res++){
        cin>>n;
        memset(a,0,sizeof(a));
        for(int i=1;i<=n;i++){
            cin>>a[i];
        }
        int ans=0;//存最终结果
        for(int i=n;i>=1;i--){
            int mi=INT_MAX,id;
            for(int j=1;j<=i;j++){
                if(a[j]<mi){
                    mi=a[j];
                    id=j;//取最小值的下标
                }
            }
            ans+=min(id-1,i-id);//加上交换次数
            for(int j=id+1;j<=i;j++){
                a[j-1]=a[j];
            }//将当前最小值删除
        }
        cout<<"Case #"<<res<<": "<<ans;//输出答案
        if(res!=t) cout<<endl; 
    }
    return 0;//完结撒花!!!
}

感谢阅读。

最后,留个赞再走吧。