题意:
给一个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 __int64 using 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; //处理到第几个1 for(int i=0;i<cnt;i++) { if(v[i]=='0') ans+=min((v1[j++]-i)*x,y); } printf("%I64d\n",ans); } return 0; }
时间: 2024-10-09 06:11:43