Codeforces Round #493 (Div. 2) C - Convert to Ones

104 阅读1分钟

第一种操作其实是为了将全为0的区段合并,每操作一次全为0的区段就会减少一个。但不是每次都要用操作1.如果x>=y的话,使用操作2一样可以达到目的,而且更省钱。

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<vector>
#include<queue>
#define mem(a,x) memset(a,x,sizeof(a));
#define s1(x) scanf("%d",&x);
#define s2(x,y) scanf("%d%d",&x,&y);
#define s3(x,y,z) scanf("%d%d%d",&x,&y,&z);
#define s4(x,y,z,k) scanf("%d%d%d%d",&x,&y,&z,&k);
#define ls 2*rt
#define rs 2*rt+1
#define lson ls,L,mid
#define rson rs,mid+1,R
#define ll long long
using namespace std;
typedef pair<int,int> pii;
const ll inf = 0x3f3f3f3f;
/*void dis(int a[], int n){
	printf("总数为%d个\n",n); 
	for(int i = 0; i < n; i++) 	cout<<a[i]<<", ";
	cout<<endl<<"------------------"<<endl;		
}*/

const int mx = 3e5 + 10;
char a[mx];
int n,x,y;
ll ans;
void slove1(){
	ans = 0;
	int ok = 0;
	ll co=0;
	for(int i = 0; i < n; i++){
		if(ok){
			if(a[i] == '1'&& a[i+1] != '1')
				ok = 0;
		}
		else{
			if(a[i] == '0'){
				co++;
				ok = 1; 
			}
		}
	}
	
	//return ans;
	if(co == 0)
		puts("0");
	else
	cout<<(co-1)*min(x,y)+y<<endl;
}

int main(){
	//int T=10;
	//scanf("%d",&T);
	s3(n,x,y);
	//mem()
	scanf("%s",a);
	  slove1();

	
	return 0;
}

\

本文已参与「新人创作礼」活动,一起开启掘金创作之路