您的位置:首页 > 其它

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

2015-05-03 17:31 309 查看
题意:

给一个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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: