Codeforces Round #642 (Div. 3) E. K-periodic Garland 思维

题目连接

题目大意

给你一个01串,要你用最少的变化次数使得所有的1相邻的距离为k。变化的方式为1->0,0->1.要你求最少的变化次数

题目思路

emm完全没啥思路,看了题解,其实就是你要想这些数字1都是modk等于一个定值,那么你就可以用余数开始枚举。
首先肯定时要统计所有1的个数 sum
然后把 ai 中的字符 1 看成数字 1,字符 0 看成数字 −1,问题就变成了求 ai 中最大连续子序列和 (now)sum-now即为最优解。有些难解释,但是自己仔细思考应该就明白了。遇到此类题目就是要枚举余数

代码

#include
#include
#include
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;
}

你可能感兴趣的:(思维)