题目描述
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的个数
最后总结:写博客一定要写思路。千万不要就一句“直接排就完事了”。另外回头再看,发现代码写的很臃肿,大家自己修改吧。