标签:int sum Codeforces cin maxn 字符串 687 include Div
题意:有一个小球需要从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
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。