C. Bouncing Ball(从后往前的前缀和)

2023-11-09 01:59

本文主要是介绍C. Bouncing Ball(从后往前的前缀和),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

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(从后往前的前缀和)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/373534

相关文章

【LeetCode热题100】前缀和

这篇博客共记录了8道前缀和算法相关的题目,分别是:【模版】前缀和、【模版】二维前缀和、寻找数组的中心下标、除自身以外数组的乘积、和为K的子数组、和可被K整除的子数组、连续数组、矩阵区域和。 #include <iostream>#include <vector>using namespace std;int main() {//1. 读取数据int n = 0, q = 0;ci

实现日期往前或往后或跳转到指定月份或天数

//月份跳转 //初始日期 String yearMonth = "201702"; String yearMonthStr = ""; //往前(负数)或往后(正数) int add = -2; SimpleDateFormat sdf = new SimpleDateFormat("yyyyMM"); Date source = sdf.parse(yearMonth); Cal

前缀和 — 利用前缀信息解决子数组问题

【前缀和的核心思想是预先处理数组来快速计算任意子数组的和,基本上用于数组和序列问题。】 前缀和算法具体步骤 构造前缀和数组: 给定一个数组nums,其前缀和数组prex定义为prex[i]表示为数组nums从起始位置到第i个位置的元素累加和。构建前缀和公式: p r e x [ i ] = n u m s [ i ] ( i = = 0 ) p r e x [ i ] = p r e x

每日一题~cf 970 div3 (A思维,B小模拟,C二分,D排列数建图成环,E 26个字母暴力+前缀和,F 逆元,G 数论gcd )

A 题意: 有 a 个1 ,b 个2.问是否能将这些数划分为两个数值相等的集合。 输出 YES 或者 NO —————— 问题等价于 将数组 分成两个数值相同的数组。所以sum 应该是偶数。也就是说 1 的个数是偶数。在i1的个数是偶数的情况下,将 2 分成两份,如果2 的个数是偶数,OK。如果是奇数那么需要1来补齐,如果1 的个数大于等于2那么可以补齐。(1 的个数是偶数,需要2个1来补齐,剩下

HDU 1556 Color the ball (树状数组-- 区间更新,单点求值)

OJ题目 :点这里~~ 与 单点更新,区间求值 稍有不同,需要理解注意。 AC_CODE int n;int num[100002];int lowbit(int x){return x&(-x);}int sum(int x){int ret = 0;while(x > 0){ret += num[x];x -= lowbit(x);}return ret;}void ad

【数据结构-二维前缀和】力扣1504. 统计全 1 子矩形

给你一个 m x n 的二进制矩阵 mat ,请你返回有多少个 子矩形 的元素全部都是 1 。 示例 1: 输入:mat = [[1,0,1],[1,1,0],[1,1,0]] 输出:13 解释: 有 6 个 1x1 的矩形。 有 2 个 1x2 的矩形。 有 3 个 2x1 的矩形。 有 1 个 2x2 的矩形。 有 1 个 3x1 的矩形。 矩形数目总共 = 6 + 2 + 3 + 1 +

Python高效实现Trie(前缀树)及其插入和查找操作

Python高效实现Trie(前缀树)及其插入和查找操作 在Python面试中,考官通常会关注候选人的编程能力、问题解决能力以及对Python语言特性的理解。Trie(前缀树)是一种高效的数据结构,广泛应用于字符串处理、自动补全、拼写检查等场景。本文将详细介绍如何实现一个Trie,并提供插入和查找操作,确保代码实用性强,条理清晰,操作性强。 1. 引言 Trie(前缀树)是一种树形数据结构,

Jaxb - 生成带命名空间和节点前缀的Xml的方式

一、生成带命名空间的Xml     Xml效果 <Order xmlns="http://www.xl.com.cn/msg">     Java代码 /*** Entity*/@XmlRootElement(name="Order", namespace="http://www.xl.com.cn/msg")public class Order{} 二、声明带前缀的命名空间

react 从后端获取文件流导出

//掉用后端接口 获取文件数据 POST 请求export function exportGetFile(url: string, data: any) {return executeAndTryCatch(() =>request<Record<string, any>>(url, {method: 'GET',params: data,responseType: 'blob',getResp

【UVa】10755 Garbage Heap 三维前缀和

题目分析:将前缀和应用到三维,求最大子矩阵。为S[x][y][z]数组中每个坐标保存从(0,0,0)到(x,y,z)范围内的子矩阵的元素和,最后用多次区间加减法可以得到需要的子矩阵的元素和,再用类似一维求最大连续和的方法求三维最大连续和。 代码如下: #include <cstdio>#include <cstring>#include <algorithm>using