题意:
给一个01串,,相邻的01交换代价为X,否则为Y。
问把全部1变到0前面的最小费用。
思路:
对于 01011->11100
如果只靠相邻位移动是需要5步的。
然而不管怎么移动,步数是固定的。
那我们就把最前面的0和最后面的1交换
假设0在i,1在j。我们交换的代价就是min(y,x*(j-i))
然后累加求和就好了!
很棒的脑洞题!
代码:
#include"cstdlib"#include"cstdio"#include"cstring"#include"cmath"#include"queue"#include"algorithm"#include"iostream"#include"map"#define ll __int64using namespace std;ll v1[123456];char v[123456];int main(){int t;cin>>t;while(t–){ll x,y;scanf("%I64d%I64d",&x,&y);scanf("%s",v);int len=strlen(v);int cnt=0;for(int i=len-1;i>=0;i–) if(v[i]=='1') v1[cnt++]=(ll)i; //找全部1的位置ll ans=0;int j=0; //处理到第几个1for(int i=0;i<cnt;i++){if(v[i]=='0') ans+=min((v1[j++]-i)*x,y);}printf("%I64d\n",ans);}return 0;}
深重如溺入蓝色的海洋,无法呼吸。