HDU - 6376 度度熊剪纸条

很菜,比赛时题意理解错了。。。。。

完了后看了下高手的代码,恍然大悟

继续加油喽

---------------------------------------------------------------------------------------------

三种情况讨论即可:

1.在前导1跟后导1中取个最大的,然后在中间取到最多的

2.前面后面都要,中间取最多

3.前面后面都不要,只在中间取最多

ac代码:

#include<bits/stdc++.h>
using namespace std;

int N,K,M;
char S[10005];
int A[10005];

int main(){
    int i,l,r,now;
    while(~scanf("%d%d",&N,&K)){
        scanf("%s",S+1);
        for(i=1;i<=N&&S[i]=='1';i++);
        if(!K||i>N){
            printf("%d\n",i-1);
            continue;
        }
        l=i-1;
        for(i=N;i&&S[i]=='1';i--);
        r=N-i;
        now=0;
        M=0;
        for(i=1;i<=N;i++)A[i]=0;
        for(i=l+1;i<=N-r;i++)
            if(S[i]=='1')
                now++;
            else if(now)
                A[++M]=now,now=0;
        sort(A+1,A+M+1,greater<int>());
        for(i=1;i<=N;i++)
            A[i]+=A[i-1];
        printf("%d\n",max(max(l,r)+A[K>>1],max(l+r+A[K-1>>1],A[K+1>>1])));
        /*比赛公告最后说不能翻转,其实跟max(l,r)+A[K>>1]跟反转来说没什么区别,原因是
          比如:11011101110111  砍4刀
          刚开始我也想的是110*111*0*111*0111这样砍(*为砍的地方)
          仔细想想 110*111*0*1110*111  这样砍不就更划算吗。
        */
        //k+1,对于偶数k来说没什么区别,对于奇数k来说,
        //如:110110111011 砍三刀,00*11*0*111000  跟4刀 00*11*0*111*000 效果一样,加一为了方便计算。
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_40679299/article/details/81633534