传送门: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 ",ans); } return 0; }