[思路题+贪心] fzu oj 2197 最小花费

题意:

给一个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;}

深重如溺入蓝色的海洋,无法呼吸。

[思路题+贪心] fzu oj 2197 最小花费

相关文章:

你感兴趣的文章:

标签云: