标签:des style blog io os ar java for sp
Input
Your program will be tested on one or more data sets. Each data set is described on a single line. The line is a non-empty string of opening and closing braces and nothing else. No string has more than 2000 braces. All sequences are of even length.---
2009 ANARC
题目大意:一串由‘{‘和‘}‘组成的字符串,‘{‘和‘}‘可以互相转换,括号匹配的时候
为稳定状态。输入一个字符串,问最少经过几次变换能达到稳定状态。
思路:先建立一个栈,让每个字符逐个进栈,若相邻的两个字符为"{}"(即相邻括
号匹配),则两个字符同时出栈。最终栈里边留下括号不匹配的项。
通过观察可知:最终留在栈里的肯定为以下情况
“}}}}…{{{{{…",即左边全为‘}‘,右边全为‘{‘。那么最少要转换多少次呢。
由题意可知,括号总数为偶数
分别计算‘}‘的个数sum1,‘{‘的个数sum2。
若‘}‘个数为奇数,则‘{‘个数也为奇数,则右括号最少需要变化(sum1+1)/2次,
左括号最少变化(sum2+1)/2次。
比如 }}}}}{{{ 左边至少变化3次才为{}{}{,右边至少变化2次才为}{}
最终为{}{}{}{}。
若‘}‘个数为偶数,则‘{‘个数也为偶数,则右括号最少需要变化sum1/2次,
左括号最少变化sum2/2次。
比如 }}}}}}{{{{ 左边至少变化3次才为{}{}{},右边至少变化2次才为{}{}
最终为 {}{}{}{}{}。
因为若sum1和sum2都为偶数,则sum1/2 = (sum1+1)/2;
sum2/2 = (sum2+1)/2。
由上可以得到同一个式子:最终sum = (sum1+1)/2 + (sum2+1)/2
#include<stdio.h> #include<string.h> char a[2010]; int stack[2010]; int main() { int kase = 1; while(~scanf("%s",a) && a[0]!='-') { int len = strlen(a); int top = 1; for(int i = 0; i < len; i++) { if(a[i]=='{') { stack[top] = 1; top++; } else if(a[i]=='}') { if(stack[top-1] == 1) { stack[top-1] = 0; top--; } else if(stack[top-1] == 2) { stack[top] = 2; top++; } else { stack[top] = 2; top++; } } } int sum1,sum2; sum1 = sum2 = 0; for(int i = 0; i < top; i++) { if(stack[i] == 2) sum2++; if(stack[i] == 1) sum1++; } int sum = (sum1+1)/2 + (sum2+1)/2; if(top == 1 && stack[0]==0) printf("%d. %d\n",kase++,top-1); else printf("%d. %d\n",kase++,sum); memset(a,0,sizeof(a)); } return 0; }
标签:des style blog io os ar java for sp
原文地址:http://blog.csdn.net/lianai911/article/details/40296023