9508 诸葛给我牌

Description

    三国杀是现在流行的桌游..分为两方,用牌来进行对战,每一张牌都有自己的属性,而每一个武将(就是玩家)都有自己的技能.
    每一次玩家都从牌堆里面抽两张牌到手牌上,然后进行出牌杀死对方玩家(更具体请参考官方说明)..
    诸葛亮的技能就是能看到牌堆上面的5张牌而可以对这5张牌进行摆放,绝对自己或者下家得到的牌.
    而甄姬的技能就是一开始可以在牌堆里面摸牌,只要摸到的是黑色牌都可以拿到手牌上,一直摸到不是黑色的牌为止.
    现在诸葛亮和甄姬刚好坐在一起,甄姬成为了诸葛亮的下家.现在诸葛亮想让甄姬拿到尽可能多的牌.应该如何摆放牌呢
    现在将诸葛亮的技能加强点(5张太少了,不够给力),他可以看到牌堆的所有牌,但他不能抽牌,而只能去掉牌堆里面的某些牌,而去掉牌要符合以下规则
    1.	从牌顶一直拿
    2.	从牌中间拿出连续的一段牌
    这两个规则最多只能用一次或者不用
    而且这技能是在诸葛亮拿完自己的手牌才发动的,问甄姬最多能拿到多少张呢
    由于牌要不是红,要不是黑,则0表示黑,1表示红
    例如
    00011101100111000000
    如果我把前面的111拿走,那么甄姬就能拿到前面的4个0
    如果我把000111和之后的11拿走,则变为0(11)00111000000,则甄姬可以拿到前面的3张,括号表示已经拿走
    但如果我把前面的000111011和最后的111拿走,就甄姬就可以拿到000000000.  8张了
    那如果把中间的11101100111拿走呢? 我们可以拿到9张。
    记住牌顶和中间都只能拿一次或者不拿




输入格式

    第一行表示串长n(1<=n<=1000000)
    第二行是长度为n的01串表示牌堆里面的牌



输出格式

    一个数表示最多可以拿到的牌数



 

输入样例

20
00011101100111000000



 

输出样例

9

 思路:统计最多连续0的个数和第二多连续0的个数,两个相加就是结果

复制代码
    /*额 ,感觉自己的代码略乱啊*/
    #include"stdio.h"
    #include"string.h"
    int d[1100000];
    char s[1100000];
    int main()
    {
        int n,i=0,j=0,t=0,max1=0,max2=0,count;
        scanf("%d",&n);
        getchar();
        memset(d,0,sizeof(d));
        gets(s);
        s[n]='\0';
        while(s[i+1]!='\0')
        {   count=0;
           for(i=t;s[i]!='\0';i++)
           if(s[i]==48)
           {count++;
           if(s[i+1]==49) break;}
            d[j]=count;
           if(d[j]>max1)  {max2=max1;max1=d[j];}
           else if(d[j]>max2)  {max2=d[j];}
           t=i+1;j++;
        }
        printf("%d\n",max1+max2);
        return 0;
    }
View Code
复制代码

 

posted @   JL_Zhou  阅读(371)  评论(0编辑  收藏  举报
编辑推荐:
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
点击右上角即可分享
微信分享提示