P1459 [USACO2.1]三值的排序 Sorting a Three-Valued Se

https://www.luogu.com.cn/problem/P1459
涉及知识点:贪心,排序
橙色题
 
思路:

因为只有三种数,所以只要交换两种数,第三种数就自然排列好了

如果存在一个1在2的位置,并存在一个2在1的位置上,优先交换这一对1和2,就能做到最优


 

#include<cmath>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
int a[1010],flag[1010];
int times_1,times_2,times_3,ans=0,n;
void draw( ){
    for(int i=1;i<=times_1;i++)
        flag[i]=1;
    for(int i=times_1+1;i<=times_2+times_1;i++)
        flag[i]=2;
    for(int i=times_2+times_1+1;i<=n;i++)
        flag[i]=3;//flag数组标记本来应该出现的数字 
}
void Find( ){
    for(int i=1;i<=n;i++){
        if(a[i]==1)times_1++;
        else if(a[i]==2)times_2++;
        else if(a[i]==3)times_3++;
    }//1,2,3分别应该出现的次数 
    draw();
    return;
}
int main( ){
    int m,j,k,i;
    int swap1=0,swap2=0;
    scanf("%d",&n);
    for(i=1;i<=n;i++)
        scanf("%d",&a[i]);    
    Find();
    for(i=1;i<=n;i++){
        if(flag[i]==1 && a[i]!=1)
            ans++;
        if(flag[i]==2 && a[i]!=2)
            ans++;
        //此时的ans是至多花费的次数 
        if(flag[i]==1 && a[i]==2)
            swap1++;
        if(flag[i]==2 && a[i]==1)
            swap2++;
    }
    ans-=min(swap1,swap2);
    //min(swap1,swap2)其实是利用容斥原理求出如果有一个1在2的位置上同时
    //存在一个2在1的位置上,可以省下的交换次数 
    printf("%d",ans);
    return 0;
}

 

posted @ 2022-07-17 14:16  -イレイナ  阅读(70)  评论(0)    收藏  举报