1067 Sort with Swap(0, i)
阿新 • • 發佈:2018-11-30
題目大意:
只能用0和別的數字交換位置這樣的方式進行排序,輸出交換次數。
解題思路:
思路很簡單,就是每次對0和0所在位置的下標元素進行交換,比如0在5號位,那麼就交換0和5,這時候5已經歸位,0在5原來的位置上。如果0就在0位置上,那麼讓0隨便交換一個沒有歸位的元素即可。想不出陣列怎麼寫。。。於是偷懶用了STL中的SET,用於儲存沒有歸位的元素,方便進行新增和刪除的操作。
程式碼如下:
#include<iostream> #include<cstdio> #include<fstream> #include<set> #include<cmath> #include<cstring> #include<string> #include<map> #include<vector> #include<iomanip> #include<cstdlib> #include<list> #include<queue> #include<stack> #include<algorithm> #define inf 0x3f3f3f3f #define MOD 1000000007 #define mem0(a) memset(a,0,sizeof(a)) #define mem1(a) memset(a,-1,sizeof(a)) #define meminf(a) memset(a,inf,sizeof(a)) //vector ::iterator it; //set<int>::iterator iter; typedef long long ll; typedef unsigned long long ull; using namespace std; int main() { int n,add[100100]={0};//儲存每個元素的地址 cin>>n; set<int> s;//儲存還沒有歸位的元素 set<int>::iterator iter; for(int i=0;i<n;i++) { int data; cin>>data; add[data]=i; if(data!=i)s.insert(data); } int sum=0; s.erase(0);//先把0刪除 while(!s.empty()) { if(add[0]) { int t=add[0]; add[0]=add[add[0]];//交換地址 sum++;//交換次數加1 //cout<<t<<endl; s.erase(t);//刪除歸位元素 } else { iter=s.begin(); //cout<<*iter<<' '<<add[*iter]<<endl; add[0]=add[*iter]; sum++; add[*iter]=0; } } cout<<sum<<endl; // std::ios::sync_with_stdio(false); // cin.tie(0); // freopen("test.txt","r",stdin); // freopen("output.txt","w",stdout); return 0; }