USACO 2.1.3 Sorting a Three-Valued Sequence

题目大意:

  这道题是说,给你一个长度为n的数组,然后,这个数组中只能包含1 2 3。求出将这个序列从小到大排序后的序列,所需要的最少的步数。

解题思路:

  这道题,拿到后,想到以前做过的一个bit求逆序数的题目,想了想,完全不搭边啊。于是,发现了,由于这个数组中只有1 2 3 这三个数字,所以,我们首先应该先对原数组进行一份copy。然后对copy后的数组从小到大进行排序。

与现在的数组的每一位进行比较,记录相同位置不同地方的所有可能情况。发现,在交换的时候,要么是两个两个进行交换,1<->2 2<->3 1<->3,要么是1->2,2->3 1->3,3->2,这样的交换,所以,我们可以一开始讲所有只交换一次的的交换

对都试一遍,然后,剩下来的就是要交换2次的情况了。

代码:

  

/*
    ID:wikioi_2
    PROG:sort3
    LANG:C++
*/

# include<cstdio>
# include<iostream>
# include<algorithm>
# include<fstream>

using namespace std;

# define MAX 1234

int a[MAX],b[MAX];
int change[MAX][MAX];

void print()
{
    for ( int i = 1;i <= 3;i++ )
    {
        for ( int j = 1;j <= 3;j++ )
            cout<<change[i][j]<<" ";
        cout<<endl;
    }
}

int main(void)
{
    //freopen("sort3.in","r",stdin);
    //freopen("sort3.out","w",stdout);
    int n; scanf("%d",&n);
    for ( int i = 0;i < n;i++ )
    {
        scanf("%d",&a[i]);
        b[i] = a[i];
    }
    sort(b,b+n);
    for ( int i = 0;i < n;i++ )
    {
        if ( a[i]!=b[i] )
        {
            change[a[i]][b[i]]++;
        }
    }
    print();
    int ans = 0;
    for ( int i = 1;i <= 3;i++ )
    {
        for ( int j = 1;j <= 3;j++ )
        {
            if ( change[i][j]&&change[j][i] )
            {
                int tmp = min(change[i][j],change[j][i]);
                ans+=tmp;
                change[i][j]-=tmp;
                change[j][i]-=tmp;
            }
        }
    }
    ans+=change[1][2]*2+change[2][1]*2;

    printf("%d\n",ans);

    return 0;
}

  

时间: 2024-10-05 05:05:47

USACO 2.1.3 Sorting a Three-Valued Sequence的相关文章

USACO Section 2.1 Sorting a Three-Valued Sequence

/* ID: lucien23 PROG: sort3 LANG: C++ */ #include <iostream> #include <fstream> #include <vector> #include <algorithm> using namespace std; void exchange(int nums[], int begin, int end, int N, int x); int sum = 0; int main() { ifst

Test Precisely and Concretely

Test Precisely and Concretely Kevlin Henney IT IS IMPORTANT TO TEST for the desired, essential behavior of a unit of code, rather than for the incidental behavior of its particular implementation. But this should not be taken or mistaken as an excuse

SIT120

Document Version: 2018-06-26 1 / 44SIT120> /unitchair "Henry Larkin"> /topic "Introduction to Responsive Web Apps"> /build web appsSIT120Document Version: 2018-06-26 2 / 44SIT120Table of ContentsOverview.......................

USACO Sorting a Three-Valued Sequence

首先来看一下题目: Sorting is one of the most frequently performed computational tasks. Consider the special sorting problem in which the records to be sorted have at most three different key values. This happens for instance when we sort medalists of a compe

USACO Train 2.1.3 Sorting a Three-Valued Sequence(sort3)

这道题就是给出由123三个值的一个数字序列,然后让你把这个序列升序排序,求最小的交换次数.注意这里可以不是相邻交换. 刚开始一看题的时候,还以为t=a a=b b=t那种水题呢,然后发现不是水题.. 于是就想思路...既然是排序题,就先把他排序好了,然后就再对比一下. 比如说USACO上的样例数据: 排序前   排序后 (1)2 1(2)2 1(3)1 2(4)3 2(5)3 2(6)3 3(7)2 3(8)3 3(9)1 3 既然他要求的是最少次数,那么我们就不要移动已经在原位不用移动的数据,

USACO Section2.1 Sorting a Three-Valued Sequence 解题报告

sort3解题报告 —— icedream61 博客园(转载请注明出处)------------------------------------------------------------------------------------------------------------------------------------------------[题目] 给你N,而后给出N个数,每个数都是1~3中的一个.请问,要把这个数列升序排好,最少需要进行几次两两交换?[数据范围] 1<=N<

【USACO】Sorting a Three-Valued Sequence(思路)

拼了老命用一种贪心的思想把它A了,但是代码写的太烂了,而且时间复杂度为 n ^ 2,我就不多说了,太烂了 之后上网找了一个规律,时间复杂度为 nlogn,而且思路很明确,又写了一遍 代码:(贪心) /* ID: 18906421 LANG: C++ PROG: sort3 */ #include<cstdio> #include<cstring> #include<vector> #include<algorithm> using namespace std

[USACO][DAG上的动态规划]Sorting A Three-Valued Sequence

好美的图论,真的 light up my life!题意: 给出一个只含有若干1,2,3的数列,我们可以两两交换数列元素:要求输出让这个数列不减的最小交换次数. 思路: 首先看起来很像冒泡.....然鹅要最少交换次数——显然不是模拟冒泡了. 开始用深搜来着,显然没办法剪枝,果断T掉.这个时候就要想一想图论了. 想起来leetcode周赛的1247这道题.题目说的是有两个在{x,y}上相同长度的字符串,我们可以在两个字符串之间任选字符交换.求第一个字符串变成第二个字符串所需要的最小交换次数,有一点

USACO 之 Section 2.1 (已解决)

The Castle: /* 搜索 1A*/ 1 /* 2 ID: Jming 3 PROG: castle 4 LANG: C++ 5 */ 6 #include <iostream> 7 #include <fstream> 8 #include <sstream> 9 #include <cstdlib> 10 #include <cstdio> 11 #include <cstddef> 12 #include <ite