码迷,mamicode.com
首页 > 其他好文 > 详细

usaco Sorting a Three-Valued Sequence

时间:2015-09-02 02:00:34      阅读:125      评论:0      收藏:0      [点我收藏+]

标签:

 题意为给一个只有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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!