Problem - 1415C - Codeforces

你正在为某个手机游戏创建一个游戏关卡。这个关卡应该包含一些从左到右排列的单元格,并以从1开始的连续整数编号,在每个单元格中,你可以放一个平台,也可以让它空着。

为了通过一个关卡,玩家必须从左边扔出一个球,使其首先落在p单元的平台上,然后弹开,再弹开(p+k)单元的平台,然后是(p+2k)单元的平台,以此类推,每隔k个平台,直到它走得比最后一个单元远。如果这些单元中的任何一个没有平台,你就不能用这些p和k通过关卡。

你已经有了一些关卡模式a1, a2, a3, ..., an,其中ai=0表示i单元中没有平台,ai=1表示有一个。你想修改它,以便在给定的p和k下通过关卡。在y秒内,你可以完全删除第一个单元格,减少一个单元格的数量,并重新计算其他单元格,保持它们的顺序。你不能做任何其他操作。你不能将单元格的数量减少到小于p。

第三例测试案例的插图。打叉的是被删除的单元格。蓝色平台是新添加的。
在给定的p和k下,你需要多少秒才能使这一关通过?

输入
第一行包含测试用例的数量t(1≤t≤100)。测试用例的描述如下。

每个测试用例的第一行包含三个整数n、p和k(1≤p≤n≤105,1≤k≤n)--你有多少个单元格,应该包含一个平台的第一个单元格,以及需要的球弹跳周期。

每个测试案例的第二行包含一个字符串a1a2a3...an(ai=0或ai=1)--不含空格的初始模式。

每个测试案例的最后一行包含两个整数x和y(1≤x,y≤104)--增加一个平台和删除第一个单元格相应所需的时间。

测试用例的n之和不超过105。

输出
对于每个测试用例输出一个整数--你需要相应修改水平的最小秒数。

可以证明,总是有可能使关卡通过的。

例子
input
3
10 3 2
0101010101
2 2
5 4 1
00000
2 10
11 2 3
10110011000
4 3
输出
2
4
10

题解:
问题就是删除前几个格子,加上个板子所需时间最小,并且能跳到>=n

正着想枚举删掉的个数再求时间,肯定会t

不如反过来想n->1

首先a[i] == 0 dp[i] = x

if(i+k<=n) dp[i] += dp[i+k]

这样我们就知道从i开始到达到条件需要铺板子的时间了

剩下就是枚举删除几个板子使时间最小了

因为起点从p开始,所以从p开始枚举

ans = min(ans,dp[i]+(i-p)*y)

#include<iostream>
#include<algorithm>
#include<map>
#include<queue>
#include<vector>
#include<cstring>
using namespace std;
char a[200050];
int dp[200050];
void solve()
{int n,p,k;cin >> n>>p>>k;for(int i = 1;i <= n;i++)cin >> a[i],dp[i] = 0;int x,y;cin >>x >>y;for(int i = n;i >= 1;i--){if(a[i] == '0')dp[i] = x;if(k+i <= n){dp[i] +=dp[i+k];}}int ans = 1e9;for(int i = p;i <= n;i++){ans = min(ans,dp[i]+(i-p)*y);}cout<<ans<<"\n";
}
int main()
{int t = 1;cin >> t;while(t--){solve();}
}
//
//

C. Bouncing Ball(从后往前的前缀和)相关推荐

  1. codeforces1457 C. Bouncing Ball

    写这个题写了1h,赛后无意看见jly神的代码只能膜拜%%% C. Bouncing Ball 预处理从1→k1\to k1→k开始跳需要添加多少个平台,预处从k+1→nk+1\to nk+1→n这些不 ...

  2. 数组-合并两个有序数组(双指针,从后往前)

    题意: 给你两个有序整数数组 nums1 和 nums2,请你将 nums2 合并到 nums1 中,使 nums1 成为一个有序数组. 说明: 初始化 nums1 和 nums2 的元素数量分别为 ...

  3. 100米队伍,从队伍后到前_我们的队伍

    100米队伍,从队伍后到前 The last twelve months have brought us a presidential impeachment trial, the coronavir ...

  4. 1415C. Bouncing Ball

    C. Bouncing Ball:题目 很好的dp,1400分难见的题 #include <bits/stdc++.h> using namespace std; #define int ...

  5. 项目使用ts辅助_启动辅助项目后的前100天该做什么

    项目使用ts辅助 by Tigran Hakobyan 由Tigran Hakobyan 启动辅助项目后的前100天该做什么 (What to do in the first 100 days aft ...

  6. oracle 从后往前,oracle从后往前截取字符串 oracle截取字符串后三位

    oracle怎么从后开始截取字符? 1.在oracle中经常需要使用到截取字符串函数substr.语法:substr(str,num1,[num2]) 默认情况下都是只需要两个参数,它的意思是从第二个 ...

  7. 数字从后往前每三位加个逗号

    数字从后往前每三位加个逗号 // 数字从后往前每三位加个逗号(不足补零)NumberFilter(num) {let n = (Array(8).join(0) + num).slice(-8)let ...

  8. 捐赠10亿美元后,前首富陈天桥的人脑研究出成果了!这一技术成未来AI最大风口…

    作者:夏弢 中国前首富陈天桥的脑研究出新成果了. 6月24日,一篇署名陈氏研究院两位学者的论文发表在了<神经元>(Neuron )杂志上.该论文基于大量实验指出:在斑马鱼和老鼠实验中,血清 ...

  9. 2022-7-15 Leetcode 151.颠倒字符串中的单词 —— 【从后往前分割】

    直接从后往前分割,看起来简洁不少. class Solution {public:string reverseWords(string s) {int i = s.size()-1;string an ...

  10. 程序员离职后收到前东家2400元,反手被告违反竞业协议赔35万

    点击"开发者技术前线",选择"星标????" 在看|星标|留言,  真爱 来自:infoQ 整理 | 钰莹 近日,一则有关程序员离职后收到前东家 2400 元, ...

最新文章

  1. 深度剖析RabbitMQ可靠性消息投递以及实践方案
  2. Linux系统下常见性能分析工具的使用
  3. NLP-基础知识-005(专家系统)
  4. 从零开始入门 K8s | 应用编排与管理
  5. .net core i上 K8S(六).netcore程序的service网络代理模式
  6. python 动态调整控件大小_python GUI库图形界面开发之PyQt5动态(可拖动控件大小)布局控件QSplitter详细使用方法与实例...
  7. Qt工作笔记-主界面往模式对话框emit信号,有注意的问题
  8. 大公司里学做人,小公司里学做事。
  9. 08年新年快乐 :-)
  10. 驱动——K7-DMA-PCIe
  11. 循环遍历java属性_java中循环遍历实体类的属性和数据类型以及属性值
  12. node Koa框架+nunjucks模版开发简易的后台
  13. 翻译:iOS Swift单元测试 从入门到精通 Unit Test和UI测试 UITest
  14. HTML实训大作业网页设计:我的简历——响应式个人简历网站模板(1页) HTML+CSS+JavaScript web网页设计制作成品...
  15. Android毕业设计选题依据,毕业设计选题依据、目的意义、
  16. 汽车维修企业管理【15】
  17. 深入浅出理解视频编码H.264结构
  18. 物理学/数学中常用的“等号”
  19. 插画“城市景色”练习
  20. 地球币EAC电脑钱包恢复的方法

热门文章

  1. 工银支付,拾方易最大的特约服务商
  2. 技术之路要学习的东西
  3. Android repo sync能否指定目录,貌似没找到解决方案?
  4. JavaAPI试题练习
  5. HBuilder配置谷歌浏览器路径无法正常使用情况
  6. <windows>win11输入法无法设置UI,变为了win10样子,解决方法
  7. 间字距、单词距、半透明、影子
  8. 2022电赛省赛C题-小车跟随行驶系统—视觉篇(openmv)心得体会
  9. 分享3款好用的电脑屏幕监控软件!
  10. QT error C2220: 警告被视为错误 - 没有生成“object”文件