Description
Solution
先用dp预处理出以i为起点,以k为步长的路上会踩到几个砖块,以及有多少个格子
然后枚举起点,更新答案
Code
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 1e5 + 7;
int dp[maxn];
int num[maxn];
int a[maxn];
void init(int n) {
for(int i = 1;i <= n;++i) {
dp[i] = num[i] = 0;
}
}
int main() {
int T;scanf("%d",&T);
while(T--) {
int n,p,k;scanf("%d %d %d",&n,&p,&k);
init(n);
for(int i = 1; i <= n;++i) {
scanf("%1d",&a[i]);
}
int x,y;scanf("%d %d",&x,&y);
for(int i = n;i >= 1;--i) {
int tmp = i + k;
if(tmp > n) {
num[i] = 1;dp[i] = a[i];
continue;
}
num[i] = num[tmp] + 1;dp[i] = dp[tmp] + (a[i]);
}
ll res = 2e18 + 7;
for(int i = 1;i+p-1<=n;++i) {
ll tmp1 = 1ll*y*(i-1);
int s = i + p - 1;
ll tmp2 = 1ll*x*(num[s]-dp[s]);
res = min(res, tmp1 + tmp2);
}printf("%lld\n", res);
}
return 0;
}