SCAU 9508 诸葛给我牌(水泥题)
9508 诸葛给我牌
时间限制:1000MS 内存限制:65535K
提交次数:0 通过次数:0
题型: 编程题 语言: 无限制
Description
![](http://scauacm.3322.org:8002/uoj/pic/9505_1290605297930_84490.jpg)
三国杀是现在流行的桌游..分为两方,用牌来进行对战,每一张牌都有自己的属性,而每一个武将(就是玩家)都有自己的技能. 每一次玩家都从牌堆里面抽两张牌到手牌上,然后进行出牌杀死对方玩家(更具体请参考官方说明).. 诸葛亮的技能就是能看到牌堆上面的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
Source
ick2
Provider
a470086609
#include<stdio.h> int main() { int n, i, fmax, smax, cnt, t, flag, temp; char ch; scanf("%d", &n); getchar(); fmax = smax = cnt = flag = 0; for(i=1; i<=n; ++i) { scanf("%c", &ch); if(ch == '0') { cnt++; } else { temp = fmax + cnt; fmax = fmax > cnt? fmax : cnt; cnt = temp - fmax; smax = smax > cnt? smax : cnt; cnt = 0; } } temp = fmax + cnt; fmax = fmax > cnt? fmax : cnt; cnt = temp - fmax; smax = smax > cnt? smax : cnt; printf("%d\n", fmax+smax); return 0; }
解题报告:
可以抽取从开始的任意连续的牌,也可以从中间揪出一列的牌,这样说的话,只要找到两段连续的长度最长和第二长的0的个数就可以了,你想想,不管你在哪里得到这样最长和第二长的0串,最前面的非连续的0串你可以叫诸葛抽走,两段长0串不管中间有多少的非零串,你也可以叫诸葛抽走,所以你尽管找最长的两串0串就行了,然后将个数相加。
为何叫水泥题,因为明明它很水嘛,但水很难让人发现,至少是我,陆陆续续的推加起来好像推了我一个小时,中午上课的时候无聊的突然冒出来这个想法
![物役记](https://s2.ax1x.com/2019/05/26/VE5YD0.jpg)
更多内容请关注个人微信公众号 物役记 (微信号:materialchains)
作者:雪影蓝枫
本文版权归作者和博客园共有,欢迎转载,未经作者同意须保留此段声明,且在文章页面明显位置给出原文链接,否则保留追究法律责任的权利。