时间限制 : - 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 }