2016陕西省赛 Rui and her sequences

本文介绍了一个包含0、1、2元素的数组排序问题,通过两种操作达到最小花费的目标。提供了C++代码实现,并讨论了贪心算法的应用。

2016陕西省赛 Rui and her sequences

题目链接:http://oj.xjtuacm.com/contest/4/problem/36/

题目大:将一个只含0,1,2的数组按不递减排序,仅有两种操作1.将所有的2置前,所有的0置后,花费a;2.将两个数交换,花费b.问最小花费.

贪心

提示里的Please ignore the first operation!什么鬼(╯‵□′)╯︵┻━┻

代码如下:

#include <cstdio>
#include <iostream>
#include <cstring>
#define N 100005
using namespace std;
int n,x,y,a[N],num[3];
struct node{
    int n[3];
    void init(){
        memset(n,0,sizeof(n));
    }
}A,B,C;
int main(void){
    while(~scanf("%d%d%d",&n,&x,&y)){
        int cost=0;
        num[0]=num[1]=num[2]=0;
        for(int i=0;i<n;++i){
            scanf("%d",&a[i]);
            num[a[i]]++;
        }

        A.init(),B.init(),C.init();
        for(int i=0;i<n;++i){
            if(i<num[0])A.n[a[i]]++;
            else if(i<num[0]+num[1])B.n[a[i]]++;
            else if(i<num[0]+num[1]+num[2])C.n[a[i]]++;
        }
        int one=min(A.n[1],B.n[0]),two=min(A.n[2],C.n[0]);
        cost=y*(A.n[1]+A.n[2]+max(B.n[2],C.n[1]));

        //cost=min(cost,x+y*max(num[0],num[2]));
        printf("%d\n",cost);
    }
}

 

转载于:https://www.cnblogs.com/barrier/p/6841651.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值