1207C - Gas Pipeline
原题目
先算出路口所需要的费用,再通过比较这样算出路口与路口之间的路的费用(两个柱子的情况和一个柱子加两个管道的情况)相加则得出答案。
如果全是路口或者全部是路口则另外计算
#include <bits/stdc++.h>
using namespace std;
#include <iostream>
using namespace std;
int t;
long long n,a,b;
//记录路径有无路口
char path[200007];
int main(){
cin >> t;
//记录是否是全是路口的情况
int flag=0;
for (int i = 0; i <t; ++i) {
cin >> n >> a >> b;
long long ans=0;
for (int j = 0; j < n; ++j) {
cin >> path[j];
if (path[j]=='1'){
//如果不是连续路口
if(path[j-1]!='1'){
ans+=4*b+a;
}
//是连续路口
else{
ans+=2*b+a;
}
} else
flag=1;
}
//如果全是路口或全部是路口
if (ans==0||flag==0){
ans = n*a+(n+1)*b;
cout << ans <<endl;
continue;
}
for (int l = 1; l < n; ++l) {
//最开始到第一个路口所需的费用
if (l-1==0&&path[0]=='0'){
ans+=b;
while (path[l-1]=='0'&&path[l]=='0'){
ans+=a+b;
l++;
}
if (path[l]=='1'){
ans+=a+a;
}
}
//在路口之间的道路所需的费用
if (path[l-1]=='1'&&path[l]=='0'){
long long count_zero=0;
while (path[l]=='0'&&l<n){
count_zero++;
l++;
}
if (l-1==n-1){
ans+=a+count_zero*a+count_zero*b;
}
else{
ans+=min((2*a+a*count_zero+(count_zero-1)*b),
(count_zero-1)*2*b+count_zero*a);
}
}
}
cout << ans <<endl;
}
return 0;
}