CF1443B Saving the City

传送门:https://codeforces.com/contest/1443/problem/B

题意:

一条路上埋着一些地雷,现在需要引爆这些地雷,引爆一个地雷花费a块钱,与它相邻的所有的地雷都会被引爆。埋一个地雷花费b块钱,求最小花费。

题解:

扫一遍不相邻的地雷群,它们之间相隔多少个位置,对于每个地雷群,判断一下直接炸了划算还是往里面填地雷和别的连起来划算。

代码:

#include<bits/stdc++.h>
using namespace std;
char mines[100005];
struct List{
    int sum;
    //int next;
    int nextcost;
}mapp[100005];
int main(){
    int t;
    scanf("%d",&t);
    while(t--){
        int a,b;
        scanf("%d %d",&a,&b);
        scanf("%s",mines);
        int l=strlen(mines);
        memset(mapp,0,sizeof mapp);
        int k=0;
        for(int i=0;i<l;i++){
            if(mines[i]=='0'){
                mapp[k].nextcost++;
            }else if(mines[i]=='1' && (mapp[k].nextcost>0 || i==0)){
                //mapp[k].next=++k;
                k++;
                mapp[k].sum++;
            }else{
                mapp[k].sum++;
                ;
            }
        }
        int ans=0;
        for(int i=1;i<k;i++){
            if(mapp[i].sum>0)ans+=a;
            if(mapp[i].nextcost*b<a){
                ans+=mapp[i].nextcost*b;
                mapp[i+1].sum=0;
            }
        }
        if(mapp[k].sum>0)ans+=a;
        printf("%d\n",ans);
    }
    return 0;
}

 

posted @ 2020-11-12 15:12  Isakovsky  阅读(163)  评论(0编辑  收藏  举报