首页 > 其他分享 >Codeforces Round #642 (Div. 3) E

Codeforces Round #642 (Div. 3) E

时间:2022-11-11 12:33:27浏览次数:48  
标签:string min int Codeforces cin 642 Div dp

E. K-periodic Garland

对于一个序列 显然我们只有%m相同的位置上才能放置1
不然肯定不合法
所以我们把他分成m个部分 记录一下总和
然后转化一下题意 发现他就是一个

然后我们直接暴力 然后贴板子就可以了

greedy做法

void solve(){
    int n,m;cin>>n>>m;
    string s;cin>>s;
    vector<int>v[m],cnt(m);
    int sum=0;
    for(int i=0;i<n;i++){
        v[i%m].push_back(s[i]-'0');
        if(s[i]-'0')sum++,cnt[i%m]++;
    }
    int ans=INF;
    for(int i=0;i<m;i++){
        int now=0;
        for(auto j:v[i]){
            if(j==1)now++;
            else now--;
            if(now<0)now=0;
            ans=min(ans,sum-now);
        }
    }
    cout<<ans<<endl;
}

然后其实我们还可以dp
我们发现他其实肯定是这样的 中间一坨是1 两端是0
当然这些个段的长度都可以是0
所以我们的dp状态就出来了
dp[i][0/1/2]表示第i个数字属于第几个段min
这样的转移也特别简单
答案就是三个取min
这里估计大家会有疑问
这样不是只会有
000011110000
0000011111
00000000
这三种情况吗
但是我们这里的dp[][1]是直接可以从dp[0][]转移的意思就是可以不要前面一坨0
所有就包含了所有情况
111111000000
11111111111111

dp做法

void solve(){
    int n,m;cin>>n>>m;
    string s;cin>>s;
    vector<int>v[m],cnt(m);
    int sum=0;
    for(int i=0;i<n;i++){
        v[i%m].push_back(s[i]-'0');
        if(s[i]-'0')sum++,cnt[i%m]++;
    }
    int ans=INF;
    for(int i=0;i<m;i++){
        while((int)v[i].size()&&!v[i].back())v[i].pop_back();
        int dp[v[i].size()+1][3];
        memset(dp,0x3f3f,sizeof dp);
        dp[0][0]=dp[0][1]=dp[0][2]=0;
        //v[i]
        for(int j=1;j<=v[i].size();j++){
            dp[j][0]=dp[j-1][0]+(v[i][j-1]!=0);
            dp[j][1]=min(dp[j-1][1],dp[j-1][0])+(v[i][j-1]!=1);
            dp[j][2]=min(dp[j-1][1],dp[j-1][2])+(v[i][j-1]!=0);
        }
        ans=min(ans,sum-cnt[i]+min({dp[v[i].size()][0],dp[v[i].size()][2],
                                    dp[v[i].size()][1]}));
    }
    cout<<ans<<endl;
}

标签:string,min,int,Codeforces,cin,642,Div,dp
From: https://www.cnblogs.com/ycllz/p/16880140.html

相关文章

  • Little Girl and Maximum Sum CodeForces - 276C - 差分
    给定一个数列\(a={a_1,a_2,...,a_n}\)以及\(q\)次查询。其中第\(i\)次查询如同:\(l_i,r_i\),意指求\(\sum_{j=l_i}^{r_i}{a_j}\)。但是查询前可以对数列任意排......
  • 「题解」Codeforces 1098D Eels
    暴力是,每次挑出最小的两个合并。需要观察到没有产生贡献的次数很小。考虑最小的那个数的大小,如果一次合并没有产生贡献,那么最小的数至少\(\times2\).所以最多会有\(\mat......
  • Codeforces Round #697 (Div. 3) G
    G.StrangeBeauty观察性质我们发现他就是一个单向的关系要是我们3能被9整除那我们来一个能整除9的那么一定能整除3就是这个性质我们考虑dpdp[i]表示我们以a[i]结......
  • CodeForces - 708C Centroids
    题意:给出一棵有n个结点的树,对于每一个结点,如果任意删除一条边后再任意添加一条边能使这个结点成为这棵树的重心,则输出1;反之输出0。解:重心的特点:以重心为根节点时,其最大子......
  • Codeforces Round #617 (Div. 3) ABCD
    https://codeforces.com/contest/1296临时和Juang一起组队打的这场,本来定的分开打另一场,哈哈题目挺友好的,Juang70minAK了,我只写了四题,剩下的题目待补A.Arraywith......
  • Codeforces Round #702 (Div. 3) G
    G.OldFloppyDrive维护一个前缀和再维护一个单调的前缀和因为我们后面的数花费更大只有贡献更大的时候才会有用这样就好做了对于每个查询我们知道他最少的轮数肯定......
  • Codeforces Round #704 (Div. 2) D
    D.Genius'sGambit构造要是a>=k的构造很好想出来但是a+b-1>k&&k>a时其实也可以构造出来我们考虑让中间的一些1经过减法变成0然后到高位时再与低位的1相减例如:1111......
  • Codeforces Global Round 16 F | CF1566F Points Movement
    https://www.luogu.com.cn/problem/CF1566Fhttps://codeforces.com/contest/1566/problem/F这类有关线段的问题我通常都是先观察线段的包含/交对线段是否保留的影响,以约......
  • 指定div滚到到指定位置
    获取页面某一元素的绝对X,Y坐标varX=$('#ElementID').offset().top;varY=$('#ElementID').offset().left;获取相对(父元素)位置:varX=$('#ElementID').position(......
  • Codeforces Round #740 (Div. 1, based on VK Cup 2021 - Final (Engine)) B
    B.UptheStrip考虑dpdp[i]表示当前i位置的cnt考虑转移我们对于第一个操作显然只用维护一个后缀和即可dp[i]+=s[i+1]对于第二个操作也很简单我们知道i的值z除一......