9508 诸葛给我牌

原文链接: http://www.cnblogs.com/arcfat/archive/2012/11/05/2756110.html

9508 诸葛给我牌

时间限制:1000MS  内存限制:65535K

题型: 编程题   语言: 无限制

 

Description


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

 

Input

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

Output

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

 

Sample Input

20
00011101100111000000

 

Sample Output

9


//以下为AC了的代码 
#include<stdio.h>
#include<string.h>
int main()
{
	int len,i,j,k,max,cnt,zeroset[500001]={0};
	int maxsum,maxtemp,maxsbpt,total;
	char str[1000001]={'\0'},c;
	scanf("%d",&len);
	c=getchar();    //用来接收scanf()后的回车符  
	for(i=0;i<len;i++)
		str[i]=getchar();

	if(str[0]=='0') zeroset[1]=1;
	else zeroset[1]=0;	
	cnt=1;
	for(i=1;i<len;i++)
	{
		if(str[i]=='0') zeroset[cnt]++;
		else if(str[i-1]=='0') cnt++;
	}
	if(str[len-1]=='0') total = cnt;
	else total = cnt - 1;
	
	maxsum=0;maxsbpt=0;
	for(i=1,max=0;i<=total;i++)
	{
		if(zeroset[i]>max)
		{
			max=zeroset[i];
			maxsbpt=i;
		}
	}
	maxsum+=max;
	
	for(i=1,max=0;i<=total;i++)
	{
		if(zeroset[i]>max && i!=maxsbpt)
		{
			max=zeroset[i];
		}
	}
	maxsum+=max;
	
	printf("%d\n",maxsum);
	return 0;
}

转载于:https://www.cnblogs.com/arcfat/archive/2012/11/05/2756110.html

猜你喜欢

转载自blog.csdn.net/weixin_30821731/article/details/94789587