UVA11925-Generating Permutations(貪心)
Accept: 214 Submit: 1429
Time Limit: 1000 mSec
Problem Description
A permutation on the integers from 1 to n is, simply put, a particular rearrangement of these integers. Your task is to generate a given permutation from the initial arrangement 1,2,3,...,n using only two simple operations.
? Operation 1: You may swap the ?rst two numbers. For example, this would change the arrangement 3,2,4,5,1 to 2,3,4,5,1.
? Operation 2: You may move the ?rst number to the end of the arrangement. For example, this would change the arrangement 3,2,4,5,1 to 2,4,5,1,3.
Input
The input consists of a number of test cases. Each test case begins with a single integer n between 1 and 300. On the same line, a permutation of integers 1 through n is given where consecutive integers are separated by a single space. Input is terminated by a line containing ‘0’ which should not be processed.
Output
For each test case you are to output a string on a single line that describes a sequence of operations. The string itself should consist only of the characters ‘1’ and ‘2’. This string should be such that if we start with the initial arrangement 1,2,3,...,n?1,n and successively apply rules 1 and 2 according to the order they appear in the output, then the resulting permutation is identical to the input permutation. The output string does not necessarily need to be the shortest such string, but it must be no longer than 2n2 characters. If it isSample Input
3 2 3 1
4 4 2 3 1
0
Sample Output
1
2
12122
題解:這個題首先應該轉換一下思維,考慮將給定串排成升序而不是將排好序的串變成給定串,這樣會好想很多,註意如果這樣思考的話,1操作就變成把最後一個數移到最前面,2操作不受影響。排序就是一個消除逆序對的過程,所以如果前面兩個數是滿足第一個數大於第二個數,那就要通過交換來消除這個逆序對(這樣操作次數少),這裏有個特殊情況就是第一個數是n並且第二個數是1,這時雖然構成逆序,但是是有可能通過把後面的數移到前面而使序列有序的,所以這時不要交換。
1 #include <bits/stdc++.h> 2 3 using namespace std; 4 5 int n; 6 deque<int> seq; 7 string ans; 8 9 bool check() { 10 for (int i = 0; i < n; i++) { 11 if (seq[i] != i + 1) return false; 12 } 13 return true; 14 } 15 16 int main() 17 { 18 //freopen("input.txt", "r", stdin); 19 while (~scanf("%d", &n) && n) { 20 seq.clear(); 21 ans = ""; 22 int x; 23 for (int i = 0; i < n; i++) { 24 scanf("%d", &x); 25 seq.push_back(x); 26 } 27 28 while (true) { 29 if (seq[0] == 1 && check()) { 30 break; 31 } 32 if (seq[0] < seq[1] || seq[0] == n && seq[1] == 1) { 33 seq.push_front(seq[n - 1]); 34 seq.pop_back(); 35 ans += ‘2‘; 36 } 37 else { 38 swap(seq[0], seq[1]); 39 ans += ‘1‘; 40 } 41 } 42 reverse(ans.begin(), ans.end()); 43 cout << ans << endl; 44 } 45 return 0; 46 }
UVA11925-Generating Permutations(貪心)