标签:
题意为给一个只有1 2 3组成的序列,通过两两交换得到一个升序的数列,求两两交换的次数
拿排序后的序列为标准,先找出交换一次能使两个数变为正确位置的一对数的数量(第一种交换),再找交换一次只能使一个数进入正确位置的三个数的数量(第二种交换)。
做第一种交换的代价为需要交换位置的数的(对数),第二种交换的代价为需要交换的数的个数,也相当于需要交换的每三个数花费代价为2;
/* ID: modengd1 PROG: sort3 LANG: C++ */ #include <iostream> #include <stdio.h> #include <memory.h> #include <algorithm> using namespace std; int input[1000],order[1000]; int state[4][4];//state[i][j]表示排序后在1区里的j的数量(1区为排序后数组中全为1的区域) int main() { freopen("sort3.in","r",stdin); freopen("sort3.out","w",stdout); int N; scanf("%d",&N); for(int i=0;i<N;i++) scanf("%d",&input[i]); memcpy(order,input,sizeof(order)); memset(state,0,sizeof(state)); sort(order,order+N); int counter=0; for(int i=0;i<N;i++) { state[order[i]][input[i]]++; } int exchange1_3=min(state[1][3],state[3][1]);//1区里的3和3区里的1交换,代价为1区里三的个数和3区里1的个数取最小值 int exchange1_2=min(state[1][2],state[2][1]);//同上1和2换 int exchange2_3=min(state[2][3],state[3][2]);//同上2和3换 counter=state[1][2]+state[1][3]-exchange1_2-exchange1_3;//1 2 3,互换一个圈的数量 counter*=2;//代价为圈数的2倍 counter+=exchange1_2+exchange1_3+exchange2_3;//加上代价为1的操作数 cout<<counter<<endl; return 0; }
usaco Sorting a Three-Valued Sequence
标签:
原文地址:http://www.cnblogs.com/modengdubai/p/4777470.html