每次選擇一個數放到最後,把陣列調成有序需要多少次操作?
阿新 • • 發佈:2019-02-02
度度熊有一個N個數的陣列,他想將陣列從小到大 排好序,但是萌萌的度度熊只會下面這個操作:
任取陣列中的一個數然後將它放置在陣列的最後一個位置。
問最少操作多少次可以使得陣列從小到大有序?
最開始的思路:
19
7
8
25
使用set將輸入陣列排序,從頭遍歷,從最小值開始,將當前值之前所有比現在值大的數放到最後。
19 7 8 25
— 7 8 25 19
— 7 8 — 19 25
則共需要兩次操作,由此可寫得程式碼
#include<iostream> #include<vector> #include<set> #include<deque> using namespace std; int main() { int n; cin >> n; deque<int> num; set<int> s; for (int i = 0; i<n; i++) { int temp; cin >> temp; num.push_back(temp); s.insert(temp); } int res = 0; for (auto iter = s.begin(); iter != s.end(); iter++) { int val = *iter; set<int> ss; for (int i = 0; num[i] != val; i++) { if (num[i]>val) { ss.insert(num[i]); num.erase(num.begin() + i); i--; } } res += ss.size(); if (ss.size()>0) { for (auto iter = ss.begin(); iter != ss.end(); iter++) { num.push_back(*iter); } } } cout << res << endl; return 0; }
問題:ac通過率70%
測試用例:10 11 12 1 3 4 5 6 7 8 9 2
按上述思路進行分析供需13次操作,但是正確答案10次可以得到有序序列。
1 3 4 5 6 7 8 9 2 10 11 12 //3次操作
1 2 10 11 12 3 4 5 6 7 8 //7次操作
1 2 3 4 5 6 7 8 9 10 11 12 //3次操作
存在的問題:如果先把 3 4 5 7 8 9 放到最後,再把10 11 12 放到最後,則可以調節成有序。
這裡正確的思路,選擇第1小和第2小的數排成有序,選擇第2小和第3小,。。。第n-1小第n小 排序
別人的程式碼::)
#include<map> #include<vector> #include<algorithm> using namespace std; int main() { int n,temp; cin>>n; vector<int> v; map<int,int> m; for(int i=0;i<n;i++) { cin>>temp; v.push_back(temp); m[temp]=i; } sort(v.begin(),v.end()); int t=n,count=0; for(int i=0;i<n-1;i++) { if (m[v[i]]>m[v[i+1]]) { m[v[i+1]]=t++; count++; } } cout<<count<<endl; }