K-periodic Garland CodeForces - 1353E(暴力+贪心+dp)

题意:

给定长为 n 的 0, 1 字符串,你可以通过一次操作改变一个字符(0 变 1 or 1 变 0),问最少几次操作可以使任意相邻两个 1 之间的距离为 k ?

题目:

You are given a garland consisting of n lamps. States of the lamps are represented by the string s of length n. The i-th character of the string si equals ‘0’ if the i-th lamp is turned off or ‘1’ if the i-th lamp is turned on. You are also given a positive integer k.

In one move, you can choose one lamp and change its state (i.e. turn it on if it is turned off and vice versa).

The garland is called k-periodic if the distance between each pair of adjacent turned on lamps is exactly k. Consider the case k=3. Then garlands “00010010”, “1001001”, “00010” and “0” are good but garlands “00101001”, “1000001” and “01001100” are not. Note that the garland is not cyclic, i.e. the first turned on lamp is not going after the last turned on lamp and vice versa.

Your task is to find the minimum number of moves you need to make to obtain k-periodic garland from the given one.

You have to answer t independent test cases.

Input

The first line of the input contains one integer t (1≤t≤25 000) — the number of test cases. Then t test cases follow.

The first line of the test case contains two integers n and k (1≤n≤106;1≤k≤n) — the length of s and the required period. The second line of the test case contains the string s consisting of n characters ‘0’ and ‘1’.

It is guaranteed that the sum of n over all test cases does not exceed 106 (∑n≤106).

Output

For each test case, print the answer — the minimum number of moves you need to make to obtain k-periodic garland from the given one.

Example

Input

6
9 2
010001010
9 3
111100000
7 4
1111111
10 3
1001110101
1 1
1
1 1
0

Output

1
2
5
4
0
0

Solution:#

显然根据题意可以得知最终所有 1 的位置 mod k 的余数 t 都相同。那么我们就可以去枚举 t,判断在这种情况下,需要几次操作,最后取 min 即可。
  首先我们要知道的是我们最多改变多少次:原字符串 1 的个数 −1 次。
  我们先算出原字符串 1 的个数 cnt。然后假设原字符串的 1 对应 1,0 对应 −1,那么我们将对应位即:t, t+k, t+2∗k, … 的字符提取出来,按照对应方式组成一个新序列,那么求出该序列的最大连续子段和 cur,那么 min(cnt−cur) 就是答案。
  我们知道只有 t, t+k, … 这些位才有可能为 1,那么我们求出的 cur 无非就两种情况:
  1. a, b, c (a, c是一连串的 −1; b 是一连串的 1);
  2. a, b, c (a,c 是一连串的 1; b 是一连串的 −1)(a+b+c>max(a,c))。
  对于 1. 来说,cur 个 1 是不需要改变的,那么在其他的位置多出来 cnt−cur 个 1,所以需要 cnt−cur 次来把他们变为 0。
  对于 2. 来说,有 a+c 个 1 是不需要改变的,我们需要把中间的 b 个 0 变为 1,还需要把 cnt−a−c 个其他位置的 1 变为 0。即 b+cnt−a−c=cnt−cur(cur=a+c+b)。
  求出最大子段和其实就是最多不需要改变的个数(新序列)。

AC代码:

/**题目大意
给你一个01串,要你用最少的变化次数使得所有的1相邻的距离为k。
变化的方式为1->0,0->1.要你求最少的变化次数
题目思路
emm完全没啥思路,看了题解,其实就是你要想这些数字1都
是modk等于一个定值,那么你就可以用余数开始枚举。
首先肯定时要统计所有1的个数 sum
然后把 ai 中的字符 1 看成数字 1,字符 0 看成数字 −1,
问题就变成了求 ai 中最大连续子序列和 (now)sum-now即为最优解。
有些难解释,但是自己仔细思考应该就明白了。遇到此类题目就是要
枚举余数*/
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long ll;
const int maxn=1e6+5;
char s[maxn];
int t,n,k,sum,now,ma;
int main()
{scanf("%d",&t);while(t--){sum=0,ma=0;scanf("%d %d %s",&n,&k,s);for(int i=0; i<=n-1; i++){if(s[i]=='1')sum++;}for(int i=0; i<=k-1; i++){now=0;for(int j=i; j<=n-1; j=j+k) //1->1 0->-1{int x=2*(s[j]-'0')-1;now+=x;if(now<0)now=0;ma=max(ma,now);//最大连续的值}}printf("%d\n",sum-ma);}return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/309732.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【视频回放与课件】零基础入门AI开发

今天上午&#xff0c;受广州图书馆邀请&#xff0c;在第一讲《零代码上手人工智能》的基础上&#xff0c;以《零基础入门AI开发》为主题&#xff0c;分四步解锁人工智能学习的概念与开发工具&#xff0c;让您在一小时内轻松掌握人工智能开发要领。本次课程内容主要包括&#xf…

三年级计算机群鸭戏水教案导入,三年级下册信息技术教案-3.7群鸭戏水-插入自选图形|清华版.doc...

第七课??《群鸭戏水——自选图形》??【教学内容分析】?本课&#xff0c;是小学信息技术(清华版)三年级下册第七课——自选图形的内容&#xff0c;通过前面章节的学习&#xff0c;学生已经学会了插入剪贴画和图片的操作。本节课创设了森林里要开动物运动会&#xff0c;请同…

Sequence with Digits CodeForces - 1355A(暴力+数学)

题意&#xff1a; 定义&#xff1a; an1anminDigit(an)maxDigit(an)。 给定 a1 和 k&#xff0c;求 ak &#xff1f; 题目&#xff1a; Let’s define the following recurrence: an1anminDigit(an)⋅maxDigit(an). Here minDigit(x) and maxDigit(x) are the minimal and …

Redis背后的故事

导语Redis已成为世界上最受欢迎的数据库之一&#xff0c;但当初正是因为Sanfilippo对数据库“缺乏经验”&#xff0c;使他敢于打破“良好”数据库工程的各种神圣规则&#xff0c;创建了Redis。正文如果Redis之父萨尔瓦多桑菲利波普&#xff08;Salvatore Sanfilippo&#xff09…

C++实现AOE网中的关键路径算法(邻接表存储)

代码如下: #include <iostream> #include <stack> #include <string> using namespace std; const int N 10010; using vnodeType int;typedef struct Node {int adj;int tw;//弧的时间权值Node *next; }Node;typedef struct Vnode {vnodeType v;//存储图…

哈工大威海计算机组成原理,哈工大威海计算机组成原理复习.pdf

第一章 绪论1.1 计算机的产生与发展现代计算机的发展电子管时代晶体管时代集成电路时代超大规模集成电路时代1.2 冯.诺伊曼计算机模型冯诺伊曼计算机的组成&#xff0c;各部分的作用.冯诺伊曼计算机的特点.(1) 计算机由运算器、存储器、控制器和输入设备、输出设备五大部件组成…

Minimal Square CodeForces - 1360A(简单思维和图形判断)

题意&#xff1a; 给你两个大小一样的&#xff0c;边长为a&#xff0c;b的矩形将其放入一个正方形里&#xff0c;问怎样放可以使正方形面积最小&#xff08;要求正方形边和矩形边平行&#xff09; 题目&#xff1a; Find the minimum area of a square land on which you ca…

基于 abp vNext 和 .NET Core 开发博客项目 - 接入GitHub,用JWT保护你的API

上一篇文章再次把Swagger的使用进行了讲解&#xff0c;完成了对Swagger的分组、描述和开启小绿锁以进行身份的认证授权&#xff0c;那么本篇就来说说身份认证授权。开始之前先搞清楚几个概念&#xff0c;请注意认证与授权是不同的意思&#xff0c;简单理解&#xff1a;认证&…

安徽计算机学业水平测试内容,【2017年整理】安徽省学业水平测试信息技术(必修)知识点.doc...

【2017年整理】安徽省学业水平测试信息技术(必修)知识点第一章 信息与信息技术1、香农信息是用来消除不确定性的东西维纳信息就是信息&#xff0c;不是物质&#xff0c;也不是能量钟义信信息是事物运动的状态和方式物质能量是构成世界的三大要素。信息一报纸是信息报上登载的足…

Honest Coach CodeForces - 1360B(简单贪心)

题目&#xff1a; 把所给的数组分成a和b两个子数组&#xff08;元素不重复使用&#xff09;&#xff0c;令a数组的的最大值和b数组的最小值的差最小&#xff0c;并输出。 题意&#xff1a; There are n athletes in front of you. Athletes are numbered from 1 to n from l…

第五站 使用winHex利器加深理解数据页

这篇我来介绍一个winhex利器&#xff0c;这个工具网上有介绍&#xff0c;用途大着呢&#xff0c;可以用来玩数据修复&#xff0c;恢复删除文件等等。。。。它能够将一个file解析成hex形式&#xff0c;这样你就可以对hex进行修改&#xff0c;然后你就可以看到修复后的结果&#…

法国 计算机金融 大学,捷报|GPA3.0,计算机转申金融,斩获法国顶级商学院录取!...

原标题&#xff1a;捷报|GPA3.0&#xff0c;计算机转申金融&#xff0c;斩获法国顶级商学院录取&#xff01;NutsCongratulationsNuts北大学员,GPA3.0计算机转申金融&#xff0c;斩获✨ 全法排名第二ESSEC金融录取✨OfferESSEC法国著名学府埃塞克高等商学院(cole suprieure des…

Similar Pairs CodeForces - 1360C(图匹配+简单贪心)

题意&#xff1a; 现有一个定义&#xff1a;&#xff08;1&#xff09;两个数的奇偶性相同 &#xff08;2&#xff09;两个数的差的绝对值为1 &#xff0c;即|a-b|1 满足以上两个条件之一&#xff0c;就可以说两个数是相似的 先给你一个数组&#xff0c;让你将数组内分成多组&…

是小厂全栈好,还是大厂专业工程师好?

作者&#xff1a;邹溪源&#xff0c;长沙资深互联网从业者&#xff0c;架构师社区特邀嘉宾&#xff01;一在博客园中使用小公司大公司进行搜索&#xff0c;列入的搜索记录长达50页。虽然完全命中关键词的文章也许并不多&#xff0c;但这或许也能体现出这个话题的热门程度。今天…

计算机英特尔显卡在哪找,Win10英特尔显卡设置图标不见了该怎么办 - 系统之家...

电脑中使用英特尔显卡的时候&#xff0c;就会在系统任务栏托盘中显示图标&#xff0c;方便用户进行操作&#xff0c;但是有win10用户反映说自己的任务栏托盘中没有显示英特尔核芯显卡的托盘图标&#xff0c;这是什么情况&#xff1f;下面小编就来给大家分析分析。一、查看是否安…