HDU3351_Seinfeld【栈】

2024-06-15 05:58
文章标签 seinfeld hdu3351

本文主要是介绍HDU3351_Seinfeld【栈】,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Seinfeld


Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 1381    Accepted Submission(s): 682

Problem Description
I’m out of stories. For years I’ve been writing stories, some rather silly, just to make simple problems look difficult and complex problems look easy. But, alas, not for this one.
You’re given a non empty string made in its entirety from opening and closing braces. Your task is to find the minimum number of “operations” needed to make the string stable. The definition for being stable is as follows:
1. An empty string is stable.
2. If S is stable, then {S} is also stable.
3. If S and T are both stable, then ST (the concatenation of the two) is also stable.
All of these strings are stable: {}, {}{}, and {{}{}}; But none of these: }{, {{}{, nor {}{.
The only operation allowed on the string is to replace an opening brace with a closing brace, or visa-versa.

 

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.
The last line of the input is made of one or more ’-’ (minus signs.)

Output
For each test case, print the following line:
k. N
Where k is the test case number (starting at one,) and N is the minimum number of operations needed to convert the given string into a balanced one.
Note: There is a blank space before N.
 
Sample Input
}{
{}{}{}
{{{}

---


Sample Output
1. 2
2. 0
3. 1
 
Source

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);elseprintf("%d. %d\n",kase++,sum);memset(a,0,sizeof(a));}return 0;
}


这篇关于HDU3351_Seinfeld【栈】的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1062614

相关文章

hdu 3351 Seinfeld / poj 3991 括号匹配2

题意:给出一个由'{' , '}' 组成的字符串,通过改变最少括号的方向使其匹配。 思路:一开始用区间dp,TLE了,贪心才能过。贪心方法:从左向右遍历,遇到左括号lef++,遇到右括号,若lef>0,lef--,否则右括号变为左括号,ans++,lef++,最后再加上多下来的左括号,即lef/2。   先给出TLE代码: #include<cstdio>#include<cstring

hdu 3351 Seinfeld(栈操作)

Seinfeld Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 2037    Accepted Submission(s): 983 Problem Description I’m out of storie

hdoj 3351 Seinfeld 【栈的简单应用】

Seinfeld Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 1373    Accepted Submission(s): 678 Problem Description I’m o