newoj 2233 Iris排队

题目描述

Iris带小朋友出去玩。为了方便带队,需要把随便站着的小朋友从矮到高排好队,矮的站在前面。由于小朋友是来自二次元的神秘物种,他们的身高只有0和1两种。现在Iris有两种操作,操作一是花费a的精力把小朋友从高到矮排好,操作二是花费b的精力把相邻的两个小朋友交换位置。Dirt统计好了初始状态下小朋友们的站队情况,请你帮Iris算一算她需要花费多少精力才能把小朋友们排好队。

输入描述

输入共两行。第一行给出空格隔开的三个正整数n,a,b,分别表示小朋友数量、进行一次操作一消耗的精力,进行一次操作二消耗的精力。第二行按从前到后的顺序给出初始状态的小朋友队伍。

输出描述

输出共一行。给出Iris最少需要花费的精力值。

样例输入

5 1 5
01001

样例输出

10

直接排就完事了

#include<stdio.h>
#define min(a,b) ((a) < (b) ? (a) : (b))
char s[10005];
int paidui(char q[],int x){
    int num=0,s1=0;
    //printf("%s",q);
    for(int i=0;i<x;i++){
        if(q[i]=='0')
            num=num+s1;
        else
            s1++;
    }
    return num;
}
int pai(char q[],int x){
    int num=0,s1=0;
    //printf("%s",q);
    for(int i=0;i<x;i++){
        if(q[i]=='0')
            s1++;
    }
    return s1*(x-s1);
}
int main(){
    int n,a,b,i;
    scanf("%d%d%d",&n,&a,&b);
    scanf("%s",&s);
    printf("%d",min(paidui(s,n)*b,a+pai(s,n)*b));
}

======2020年2月28日12:06:49更新======

今天返回来从新看这个题。竟然有点看不懂当时咋想的。。还想了半天

首先分为两种情况

1.你自己排,将1移动到队尾,思路:遇到0就跟前面所有1交换,遇到1就累加起来。最后返回交换次数*权值

2.先使用操作一,1就都在前面了,然后将1移动到后面,其实就是1的个数*0的个数

最后总结:写博客一定要写思路。千万不要就一句“直接排就完事了”。另外回头再看,发现代码写的很臃肿,大家自己修改吧。

发布了11 篇原创文章 · 获赞 1 · 访问量 193

猜你喜欢

转载自blog.csdn.net/z591593455/article/details/102654741