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