您的位置:首页 > 其它

foj 2197 最小花费

2015-05-04 15:42 309 查看
Problem 2197 最小花费

Accept: 32 Submit: 62

Time Limit: 1000 mSec Memory Limit : 32768 KB



Problem Description

给一个长度为n(n <= 10^5)的“01”串,你可以任意交换一个为0的位和一个为1的位,若这两位相邻,花费为X,否则花费为Y。求通过若干次交换后将串中的“1”全部变换到“0”前面的最小花费。



Input

第一行一个整数T(1 <= T <= 10),表示测试数据的组数。接下来3*T行,每组数据三行,第一行为整数X(1 <= X <= 10^3),第二行为整数Y(X <= Y <= 10^3),第三行是“01”串。



Output

最小花费。



Sample Input

2121100120011



Sample Output

03



Source

福州大学第十二届程序设计竞赛

题意:如题。

做法:因为移动的步数是固定,所以每次交换最前面的0和1,然后其位置记为a,b,取min((b-a*)*x,y)即可,然后把这些值累加就是ans。

#include <iostream>
#include <cstdio>
#include <climits>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <vector>
#include <queue>
#include <algorithm>
#define esp 1e-6
#define inf 0x0f0f0f0f
#define LL long long
using namespace std;
int main()
{
int i,j,k;
char s[100005];
int t,x,y,n;
int ans;
int num[100005];
scanf("%d",&t);
while(t--)
{
ans=0;
scanf("%d%d",&x,&y);
getchar();
gets(s);
n=strlen(s);
k=0;
for(i=n-1;i>=0;i--)
{
if(s[i]=='1')
num[k++]=i;
}
for(i=0,k=0;i<n;i++)
{
if(s[i]=='0')
{
int t1;
if(num[k]>i)
{
t1=(num[k++]-i)*x;
ans+=min(t1,y);
}
}
}
printf("%d\n",ans);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: