您的位置:首页 > 产品设计 > UI/UE

usaco Sorting a Three-Valued Sequence

2015-09-02 01:02 465 查看
题意为给一个只有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;
}


  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: