1. 程式人生 > >[Codeforces Round #492 (Div. 1) ][B. Suit and Tie]

[Codeforces Round #492 (Div. 1) ][B. Suit and Tie]

http://codeforces.com/problemset/problem/995/B

題目大意:給一個長度為2*n的序列,分別有2個1,2,3,...n,相鄰的位置可以進行交換,求使所有相同的數字相鄰的最少交換次數.(n<100)

題目分析:n的資料範圍特別小,所以只需要想到合理的(貪心)移動方式直接模擬即可,可以從左往右進行遍歷,遍歷到每個位置時,都把在這個位置之後且與這個數字相同的數字移動到它的旁邊直接模擬即可(之所以正確是因為這樣移動會使兩個相同元素之間的元素都往後移動一次,由於是從左到右遍歷,所以這些元素往後移動會減少以後移動的次數).

 1 #include<iostream>
 2
#include<cstdio> 3 #include<cstring> 4 #include<queue> 5 using namespace std; 6 typedef long long ll; 7 int qwq[205],a[205]; 8 int main(){ 9 //freopen("in.txt","r",stdin); 10 int n; 11 cin>>n; 12 for(int i=0;i<2*n;i++){ 13 scanf("%d",&qwq[i]);
14 a[qwq[i]]=i; 15 } 16 int ans=0; 17 for(int i=0;i<2*n;i++){ 18 if(a[qwq[i]]>i+1){ 19 for(int j=i+1;j<a[qwq[i]];j++){ 20 if(a[qwq[j]]>a[qwq[i]])ans--; 21 } 22 ans+=a[qwq[i]]-i-1; 23 } 24 } 25 cout << ans << endl;
26 return 0; 27 }
View Code