B 方块消消乐

时间限制 : - MS   空间限制 : - KB 
评测说明 : 1s,128m
问题描述

何老板在玩一款消消乐游戏,游戏虽然简单,何老板仍旧乐此不疲。
游戏一开始有n个边长为1的方块叠成一个高为n的柱子。
有红色和蓝色两种方块。
游戏操作:玩家选择两个相邻且不同色的方块,将它们消除。然后上方的方块会自动落下来,使得剩下的方块始终保持柱状。

玩家可以进行任意次上述操作,消除的方块越多,得分越高。何老板想知道:最多能消除掉多少方块?

输入格式

一个由0和1构成的字符串,表示游戏开始时的方块柱子。其中0表示蓝色方块,1表示红色方块。

输出格式

一个整数,表示最多能消除的方块数。

样例输入 1

0011

样例输出 1

4

样例输入 2

11011010001011

样例输出 2

12

样例输入 3

0

样例输出 3

0

提示

设字符串的长度为n

1 ≤ n ≤ 105

【分析】

  这道题我们可以将第二个样例画在纸上,按照要求依次消去每一个相邻的1和0,剩下的接在一起,最后剩下的一定是1和0中数量多的。因此,在读入时记录1和0的个数,然后输出2 * max(Cnt_0, Cnt_1)即可。

注意:因为不知道字符串长度,如果使用“while(scanf("%d", &A[i]) != EOF)“的话会报错,因为可能第一个输入0就返回0,导致程序不运行。因此使用字符串可以规避这个问题。

【标程】

 

 1 #include<iostream>
 2 using namespace std;
 3 int Len, Cnt_0, Cnt_1;
 4 string S;
 5 void ini() {
 6     cin >> S;
 7     Len = S.length();
 8 }
 9 void solve() {
10     for (int i = 0; i <= Len; ++ i)
11         if (S[i] == '0')++ Cnt_0;
12         else if (S[i] == '1')++ Cnt_1;
13     printf("%d", 2 * min(Cnt_0, Cnt_1));
14 }
15 int main() {
16     ini();
17     solve();
18     return 0;
19 }

 

posted @ 2019-08-11 17:30  骆孑不掉线  阅读(233)  评论(0编辑  收藏  举报