2016年省賽第七屆藍橋杯B組C/C++第九題解 交換瓶子

Rlynn發表於2020-10-09

第九題:交換瓶子

有N個瓶子,編號 1 ~ N,放在架子上。
比如有5個瓶子:

2 1 3 5 4
要求每次拿起2個瓶子,交換它們的位置。

經過若干次後,使得瓶子的序號為:

1 2 3 4 5
對於這麼簡單的情況,顯然,至少需要交換2次就可以復位。
如果瓶子更多呢?你可以通過程式設計來解決。
輸入格式為兩行:

第一行: 一個正整數N(N<10000), 表示瓶子的數目

第二行:N個正整數,用空格分開,表示瓶子目前的排列情況。
輸出資料為一行一個正整數,表示至少交換多少次,才能完成排序。

例如,輸入:
5
3 1 2 5 4

程式應該輸出:
3

再例如,輸入:
5
5 4 3 2 1

程式應該輸出:
2

資源約定:

峰值記憶體消耗 < 256M

CPU消耗 < 1000ms
請嚴格按要求輸出,不要畫蛇添足地列印類似:“請您輸入…” 的多餘內容。
所有程式碼放在同一個原始檔中,除錯通過後,拷貝提交該原始碼。
注意: main函式需要返回0

注意: 只使用ANSI C/ANSI C++ 標準,不要呼叫依賴於編譯環境或作業系統的特殊函式。

注意: 所有依賴的函式必須明確地在原始檔中 #include , 不能通過工程設定而省略常用標頭檔案。
提交時,注意選擇所期望的編譯器型別。

方法:假設目前要交換的是第i個值,找到i後面比a[i]小且最小的值與之交換即可。

#include<iostream>
using namespace std;
int main(){
 int n,t,min,pos,ans,a[105];
 cin>>n;
 for(int i=0;i<n;i++){
  cin>>a[i];
 }
 for(int i=0;i<n;i++){
  min=a[i];
  for(int j=i+1;j<n;j++){
   if(a[j]<min){
    min=a[j];
    pos=j;
   }
  }
  if(min<a[i]){
   t=a[i];
   a[i]=a[pos];
   a[pos]=t;
   ans++;
  }
 }
 cout<<ans<<endl;
 return 0;
}

相關文章