题目链接:Codeforces 390C Inna and Candy Boxes
题目大意:给出n,k和w,然后给出n个礼物盒的状况,‘1’表示有糖果,‘0’表示没有糖果,然后给出w次询问,每次询问将[l,r]区间变成标准情况需要几步,标准情况为l-1+k,l-1+2k....的盒子有糖果,其他在该区间上的盒子没有糖果。
解题思路:因为k不会大于10,所以可以先进行预先处理,将以0~k为起始的位置进行处理,dp[i][j]表示说以i为开头,区间[1,j]需要几步。然后特殊处理一下左区间的边界。
#include <stdio.h> #include <string.h> #include <algorithm> using namespace std; const int N = 100005; int n, k, w, s[15][N]; char str[N]; bool judge(int x, int y) { if ((y - x + k + 1) % k == 0 && str[y-1] == ‘0‘) return true; if ((y - x + k + 1) % k != 0 && str[y-1] == ‘1‘) return true; return false; } void init () { memset(s, 0, sizeof(s)); scanf("%d%d%d%s", &n, &k, &w, str); int len = strlen(str); for (int i = 0; i < k; i++) { for (int j = i+1; j <= len; j++) { s[i][j] = s[i][j-1]; if (judge(i, j)) s[i][j]++; } } } int handle(int x) { if (k == 1) { if (str[x-1] == ‘0‘) return 1; } else { if (str[x-1] == ‘1‘) return 1; } return 0; } void solve () { int x, y; for (int i = 0; i < w; i++) { scanf("%d%d", &x, &y); int t = x % k; printf("%d\n", s[t][y] - s[t][x] + handle(x)); } } int main () { init (); solve(); return 0; }
Codeforces 390C Inna and Candy Boxes(dp)
原文:http://blog.csdn.net/keshuai19940722/article/details/19170011