作弊的发牌者:
贝茜正在与她的N-1(2 <= N <= 100)个朋友打牌。她们玩的牌一副为K(N <= K <= 100,000,K为N的倍数)张。所有牌中,一共有M(M = K / N)张“好
牌”,其余的K - M张为“差牌”。
贝茜是游戏的发牌者,很自然地,她想把所有好牌都留给自己。她热衷于获胜,即使为此必须采取一些不正当的手段。
在若干局游戏后,贝茜的朋友们开始怀疑贝茜在游戏中作弊,于是她们想了个对策:使用新的发牌规则。规则具体如下:
- 贝茜把牌堆的最上面一张发给她右边的奶牛
- 每当贝茜发完一张牌,她都得将牌堆顶部接下来的P(1 <= P <= 10)张牌 放到底部去(一般把这个操作称为切牌)
- 然后,贝茜对逆时针方向的下一头奶牛重复上述的操作
贝茜绝望地认为,她再也不可能获胜了,于是她找到了你,希望你告诉她,将好牌放在初始牌堆的哪些位置,能够确保它们在发完牌后全集中到她手里。顺带说明一下,我们把牌堆顶的牌定义为1号牌,从上往下第二张定义为2号牌,依此类推。
这题可以用队列来维护:
第一个操作移一次,第二个操作移p次就星
for (int i=1;i<=m/n;i++) for (int j=1;j<=n;j++) { if (j==n)c[++ci]=a[h]; h++; for (int k=1;k<=p;k++) { a[++t]=a[h]; h++; } }
火车进站
有一个车站,每天都会有N辆车进站,进站按从1到N的顺序进站。现在车站的站长想让这些火车按照特定的顺序出站,问可以做到吗?
当N为5时,出站顺序若为1 2 3 4 5,可以做到,但是顺序若为5 4 1 2 3,则不行。
我们可以把火车进站就是压栈,出站则是弹栈。
扫描二维码关注公众号,回复:
1099509 查看本文章
这题是栈的模板题(这NM还能不是栈的模板题,题面都说了)
随便开三个栈就行了
while (yt<=n) { if (sta[st]==zzstack[t]) { st++; t--; } else { t++; zzstack[t]=ysstack[yt]; yt++; } }
括号匹配
一个表达式中包括变量、常量、操作符、圆括号,圆括号可以嵌套, 编写程序判断表达式中的括号是否正确匹配。输入任意一个表达式,判断其中括号是否匹配,匹配, 输出YES, 不匹配,输出NO。(表达式的长度小于50)
这个不一定要开栈,只需要开一个t,遇到左括号+1,遇到右括号-1,当t为负数,也就是右括号比左括号多时,就不匹配。如果处理完后t为0,则匹配,否则也不匹配。
for (int i=0;i<s.size();i++) { if (s[i]=='(') t++; else if (s[i]==')') t--; if (t<0) return; }