日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【蓝桥杯】 交换瓶子

發布時間:2025/3/16 编程问答 13 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【蓝桥杯】 交换瓶子 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.


有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 <xxx>, 不能通過工程設置而省略常用頭文件。


提交時,注意選擇所期望的編譯器類型。



思路:剛開始想到的是逆序數,但是看到第三個案例時就放棄了。然后是貪心,如果第i個位置 a[i] 的值不是 i ,那么就把 i 的值換回來,這個可以在輸入時預處理一下,標記第 i 個值即 a[i] 在數組下標的哪個位置,然后在此循環交換就可以了,O(n)的復雜度。


代碼:


#include<iostream> #include<cstdio> #include<cstring> #include<cstring> #include<algorithm> #include<cmath> #define M 10000+5 using namespace std;int a[M];//原數組 int v[M];//標記數組 int main(){int n; while(scanf("%d",&n)!=EOF){int ans=0;for(int i=1; i<=n; ++i){scanf("%d",&a[i]);v[a[i]]=i;//預處理 }for(int i=1; i<=n; ++i){if(a[i]!=i){swap(a[i],a[v[i]]);++ans;}}printf("%d\n",ans);}return 0; }

總結

以上是生活随笔為你收集整理的【蓝桥杯】 交换瓶子的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。