Codeforces 1214C - #583(分析思路,贪心)

aside section ._1OhGeD · · 948 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

题目描述

给定一个括号序列(可能非法),求能否通过移动最多一个字符,使得括号序列合法。

如果s为合法的括号序列,那么:

  1. s 为空
  2. s 为 "(t)",且t为合法的括号序列
  3. s 为 "t1t2",且t1和t2为合法的括号序列

思路

  1. 首先,判断一个括号序列是否合法,只需要从前往后遍历整个括号序列,同时维护一个计数器,遇到 '(' 计数器加1,遇到 ')' 计数器减 1。如果整个过程中计数器的数值为正数,且遍历完成后计数器的值为0,那么该括号序列合法;
  2. 贪心的考虑,一方面,'(' 越靠前越好(整个遍历过程中计数器前面的数值会尽可能的大),另一方面,如果需要移动括号,要么将'('往前移动,要么是')'往后移动。如果某种情形下前一种方案可行,那么后一种方案也可行。如果 ')' 往后移动,可以直接移动到序列最后面(此为最优移动方案);
  3. 注意不需要移动括号的情况。

根据上述的分析,可以写出如下的代码。

代码 (Golang)

package main
 
import "fmt"
 
func main() {
    n := 0;
    name := "";
    fmt.Scanf("%d\n", &n);
    fmt.Scanf("%s\n", &name);
 
    op := 0;
    acc := 0;
    ok := true;
    for i:= 0; i < n; i++ {
        if name[i] == '(' {
            acc ++;
        } else {
            if acc == 0 {
                if op == 0 {
                    op = 1;
                } else {
                    ok = false;
                }
            } else {
                acc --;
            }
        }
    }
 
    acc -= op;
    if ok && acc == 0 {
        fmt.Printf("Yes");
    } else {
        fmt.Printf("No");
    }
}

有疑问加站长微信联系(非本文作者)

本文来自:简书

感谢作者:aside section ._1OhGeD

查看原文:Codeforces 1214C - #583(分析思路,贪心)

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

948 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传