其他分享
首页 > 其他分享> > Codeforces Round #687 (Div. 2) C

Codeforces Round #687 (Div. 2) C

作者:互联网

题意:有一个小球需要从p开始 每次跳k个距离 问条出字符串所用的最短时间;

给一个n, p, k 分别是:字符串长度 ,小球开始位置, 跳跃长度;

再给出字符串,字符串中’1‘表示有一个平台,’0‘表示空地(小球无法从此处跳走)

对字符串有两种操作:

1.将字符串中的某个为'0'的点换成'1' 消耗 x秒

2.将字符串第一个字符删掉 消耗y秒(字符串的长度 >= p);

 

思路: 字符串每次删除p的相对位置都会改变,从p点开始到结束所经过的点 都必须是’1’,  这是就需要记录以p点开始需要变为‘1’ 的点

因为这是个等差数列,不难想到用后缀数组记录,接下来就可以计算出结果了。

代码:

 

 1 #include <iostream>
 2 #include <algorithm>
 3 #include <queue>
 4 #include <cstring>
 5 #include <vector>
 6 
 7 using namespace std;
 8 typedef long long LL;
 9 const int maxn = 2e5 + 7;
10 
11 int a[maxn], sum[maxn];
12                           
13 vector<int> v;
14 char str[maxn];
15 int main (){
16     int T;
17     cin >> T;
18     while (T -- ){
19         int n, p, k;
20         cin >> n >> p >> k;
21         scanf ("%s", str + 1);
22         int x, y;
23         cin >> x >> y;
24         //sum[0] = 0;
25         LL ans = 0x7f7f7f7f;
26         for (int i = 1; i<= n; i ++ ) sum[i] = str[i] == '0';
27         for (int i = n; i >= 1; i -- ){
28         //    sum[i] = 0;
29             sum[i] += i + k > n ? 0 : sum[i+k];
30         }
31         for (int i = p; i <= n; i ++ ){
32             ans = min(ans, 1ll * (i - p) * y + 1ll * sum[i] * x);
33         }
34         cout << ans << endl;
35         
36     }
37     return 0;
38 } 

 

标签:int,sum,Codeforces,cin,maxn,字符串,687,include,Div
来源: https://www.cnblogs.com/oneach/p/14057363.html