CodeForces 612C (STL_A题)解题报告

题目链接:http://codeforces.com/problemset/problem/612/C

--------------------------------------------------------------------------------

题意:有四种括号,按一定顺序出现,问能否完成括号的匹配,如果不能完成,最少更改几个括号能够完成括号匹配。(注意,左括号只能更换为左括号。同理右括号)

思路:本题具有这样的特征,在每次遇到括号的时候,如果不能完成括号的匹配,需要将新遇到的括号更新为比较括号,例如“{()}”,当遇到“(”时,需要将比较括号由“{”更新为“(”,由此想到利用栈的数据结构。另外,如果遇到不同类别的右括号,自然需要更改其中一位括号以完成匹配。(注意,在这种情况下,其实默认了已经完成了两个括号的匹配,所以需要将栈顶的左括号弹出)例如“{(>}”需要更新的括号数目为1。另外如果栈为空的情况下又遇到右括号,按题意属于“impossible”情况输出。本题的关键点在于由操作特性分析出所选用的合适数据结构——栈。

代码:

 1 #include<cstdio>
 2 #include<stack>
 3 #include<string>
 4 #include<iostream>
 5 #include<cmath>
 6 using namespace std;
 7 stack<char> s;
 8 char siz=0;
 9 string s1 ="0";
10 int a =0;
11 char c=0;
12 char m=0;
13 int flag = 0;
14 int head = 0;
15 int tail = 0;
16
17 int main(void){
18     getline(cin,s1);
19     for(int i =0;i<s1.length();i++){
20         c=s1[i];
21         if(s.empty()&&(c==‘>‘||c==‘}‘||c==‘)‘||c==‘]‘))
22         {
23             flag = 1;
24             break;
25         }
26         else if(c==‘<‘||c==‘{‘||c==‘(‘||c==‘[‘){
27             s.push(c);
28             head ++;
29         }
30         else if(c==‘>‘){
31             if(s.top()==‘<‘){
32                 s.pop();
33                 tail++;
34             }else{
35                 a++;
36                 s.pop();
37             }
38         }
39         else if(c==‘}‘){
40             if(s.top()==‘{‘){
41                 s.pop();
42                 tail++;
43             }else{
44                 a++;
45                 s.pop();
46             }
47         }
48         else if(c==‘)‘){
49             if(s.top()==‘(‘){
50                 s.pop();
51                 tail++;
52             }else{
53                 a++;
54                 s.pop();
55             }
56         }
57         else if(c==‘]‘){
58             if(s.top()==‘[‘){
59                 s.pop();
60                 tail++;
61             }else{
62                 a++;
63                 s.pop();
64             }
65         }
66     }
67     //printf("%d %d %d",head,tail,a);
68     if(head ==tail&&(flag==0)) printf("0\n");
69     else if(abs(head-tail)==a&&(flag==0)) printf("%d\n",a);
70     else printf("Impossible");
71
72     return 0;
73
74 }

原文地址:https://www.cnblogs.com/caomingpei/p/8322160.html

时间: 2024-10-08 10:17:25

CodeForces 612C (STL_A题)解题报告的相关文章

codeforces 591A. Wizards&#39; Duel 解题报告

题目链接:http://codeforces.com/problemset/problem/591/A 题目意思:其实看下面这幅图就知道题意了,就是Harry 和 He-Who-Must-Not-Be-Named 分别在走廊末端,各发射自己的impulse,其中Harry 的 impulse 速度为 p 米/s,He-...-Named (这个名字太长,姑且写成这样)为 q米/s.然后相遇之后各自回到它们的主人身边,再发射,问第二次相遇的时候,Harry的impulse 离他的位置距离是多少.

08年acm区域赛北京赛区 部分题解题报告

08年区域赛北京赛区 http://poj.org/searchproblem?field=source&key=Beijing+2008 POJ 3921 Destroying the bus stations 题目还是比较难的,当时的榜似乎只有4/25的通过/提交,其实题目数据很水.学长转换模型写了网络流求最小割,可以AC,不过自己造了个数据推翻了正确性.我写了个很挫的bfs套bfs,外层是最小的删除点数,内层是求最短路,数据很水可以AC.但比较蛋疼的在于bfs耗内存,而且队列中的点数是阶乘

CodeForces 250B Restoring IPv6 解题报告

Description An IPv6-address is a 128-bit number. For convenience, this number is recorded in blocks of 16 bits in hexadecimal record, the blocks are separated by colons — 8 blocks in total, each block has four hexadecimal digits. Here is an example o

圆锥曲线:椭圆小题解题报告

圆锥曲线:椭圆小题解题报告 注意事项: 由于本人水平有限,部分题目解题方法可能非最优解,如有更好方法欢迎在评论区指正. 部分题目讲解可能过于口语化,导致并不符合官方(人教版教材)的要求,请各位在考试中不要学习,使用正确的,符合要求的用语. 本文中可能存在错别字,望发现者在评论区指正. 本篇博客是为记录本人在完成学校作业的过程中遇到的问题,同时给部分同学作为解题参考用. 本篇博客中绘制图像的工具是geogebra. 1~10题: 1 题目: 已知F~1~,F~2~是椭圆\(x^2/4+y^2/3=

Codeforces Round #277.5 解题报告

又熬夜刷了cf,今天比正常多一题,比赛还没完但我知道F过不了了,一个半小时贡献给F还是没过--应该也没人Hack,写写解题报告吧= =! 解题报告如下: A题:选择排序直接搞,因为不要求最优交换次数,代码: #include <iostream> #include <algorithm> #include <cstdio> #include <memory.h> #include <vector> #include <stack> #

2016.8.27一套简单的题解题报告

一套不错的题,需要相关资料的联系我咯 考试分析: 1.  由于题目的名字加上第一道题没读完时我以为是我最不擅长的treeDP(其实不得不说,树和图上的题我真的是不想写,一般都写不对,上课太不认真,这个弱点要加强训练),我直接跳到了最后一道题,明知考3h还用了30min去分析,不过还是感谢,这30min救了我两道题出来: 这套题的确还是比较简单,后两道题只要认真分析数据都不会有问题,也许是因为暑假切了贪心和递推,我对分析数据比较在行,第三题切完之后还有2h,不过没写高精的我有点慌,打算最后留一点时

Codeforces Round #256 (Div. 2/A)/Codeforces448A_Rewards(水题)解题报告

对于这道水题本人觉得应该应用贪心算法来解这道题: 下面就贴出本人的代码吧: 1 #include<cstdio> 2 #include<iostream> 3 using namespace std; 4 5 int a[3],b[3]; 6 7 int main(void) 8 { 9 int n; 10 int need = 0; 11 int sum1 = 0,sum2 = 0; 12 for(int i=1;i<=3;++i){ 13 scanf("%d&q

CQOI2015 后3题解题报告

这个嘛= =,CQOI我只做了后面3题(前面两题老师还没考就还不敢写= =)说一下被虐报告吧= = T3:[CQOI2015]任务查询系统 描述:戳我~~~ 这道题首先很明显是道裸的数据结构题啦.首先他要求在线,那么按顺序建个函数式线段树就行啦 自己太弱调了好久= = CODE: 1 #include<cstdio> 2 #include<iostream> 3 #include<cstring> 4 #include<algorithm> 5 #inclu

codeforces 495B. Modular Equations 解题报告

题目链接:http://codeforces.com/problemset/problem/495/B 题目意思:给出两个非负整数a,b,求出符合这个等式      的所有x,并输出 x 的数量,如果 x 有无限多个,那么输出 infinity. 想了半个多小时......有个地方想遗漏了. a mod x == b,等价于  a = k*x + b.设 mul = a - b,那么 k*x = mul,然后就不断枚举 mul 的因子,即 kx = mul.由于 mod 出来的结果为 b,那么