Codeforces Round #229 (Div. 2)C. Inna and Candy Boxes

本文介绍了如何解决Codeforces竞赛中的问题C,该问题涉及计算将给定区间内的糖果盒从非标准状态调整为标准状态所需的最小步骤数。文章详细解释了使用动态规划优化解决方案的过程,并提供了关键代码片段。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目链接:http://codeforces.com/contest/390/problem/C

题意:题目大意:输入n,k,w,然后给出n个礼物盒的情况,‘1’表示盒子内有糖果,‘0’表示没有,然后给出w次询问,每次询问将[l,r]区间变成标准情况需要几步,标准情况即l-1+k,l-1+2k....的盒子有糖果,其他在该区间上的盒子没有糖果。

思路:一开始想l-1+k,l-1+2k....这样判断下去,但是1e5显然会超时,因此为了优化,我们需要预处理一下以1-k为开头的结果数,dp[i][j]表示说以i为开头,区间[i,j]需要几步。对于任意的[l,r],结果与dp[l%k][r]-dp[l%k][l]+sol(l)一致,l需要特判一下。

代码如下:

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
const int N = 1e5+10;
int n, k, w;
char str[N]; //dp[i][j]表示说以i为开头,区间[i+1,j]需要几步
int dp[15][N];

int sol(int x) 
{  
    if (k == 1) 
	{  
        if (str[x-1] == '0') return 1;  
    } 
	else 
	{  
        if (str[x-1] == '1') return 1;  
    }  
    return 0;  
}  

int main()
{
	scanf("%d%d%d%s", &n, &k, &w,str);
	int len = strlen(str);
	memset(dp, 0, sizeof(dp));
	for(int i = 0; i < k ; i++)
	{
		for(int j = i+1; j <= len ; j++)
		{
			dp[i][j] = dp[i][j-1];
			if((j+1-i+k) % k == 0) if(str[j-1] == '0') dp[i][j]++;
			if((j+1-i+k) % k != 0) if(str[j-1] == '1') dp[i][j]++;
		}
	}
	int l , r;
	while(w--)
	{
		scanf("%d%d", &l ,&r);
		int t = l % k;
		int cnt = 0;
		cnt = dp[t][r] - dp[t][l] + sol(l);
		printf("%d\n", cnt);
	}
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值