SGU 179.Brackets light

时间限制:0.25s

空间限制:12M

题意

      给定一个合法的仅由‘(‘,‘)‘组成的括号序列,求它的下一个合法排列.假定‘(‘<‘)‘.



Solution:

              先来回顾求下一个排列的算法:

                      对于一个排列 1 2 4 5 3

                      它的下一个排列将从后往前找到相邻的两个数是顺序的(即前面的数小于后面的数),将这两个数交换 得到 1 2 5 4 3

                      再将后面的所有数反转.

                       将得到

                                 1 2 5 3 4

                       即最后结果.

              对着道题来说,要保证交换的两个括号后得到的是合法的序列,只要记录每一个‘(‘前面有多少个 ‘(‘,记为f[i],‘)‘前面有多少个‘)‘,f[j].

              由于最后一位一定是‘)‘,所以只要在前面找到相邻的两个‘(‘和‘)‘  ,(注意到这里也是的顺序),满足f[i]>f[j];

              将最后的‘)’和‘(’ 交换位置,再把后面所以的括号反转。即可得到我们需要的解。

code:

#include <iostream>
#include <algorithm>
#include <string>
using namespace std;
#define sz(x) ((int) (x).size())
const int INF = 11111;
int f[INF], flag;
string s;
int main() {
	cin >> s;
	int s1 = 0, s2 = 0, len = s.size() - 1;
	//记录f数组
	for (int i = 0; i <= len; i++) {
		if (s[i] == ‘(‘)		f[i] = s1++;
		else     			f[i] = s2++;
	}
	for (int i = len, t; i >= 0; i--) {
		if (s[i] == ‘)‘) t = i;
		else if (f[t] < f[i]) {
			swap (s[len], s[i]);
			//头文<algorithm>里的翻转操作
			reverse (s.begin() + i + 1, s.end() );
			flag = 1;
			break;
		}
	}
	//没有满足条件的顺序括号
	if (flag == 0)	cout << "No solution";
	else          		cout << s;
}

  

SGU 179.Brackets light

时间: 2024-12-05 01:17:51

SGU 179.Brackets light的相关文章

sgu100~199题解

老东西了..发上来吧.. Sgu题解系列  南开中学邹事成 100:A+B略 101:Domino 给n块多米诺骨牌,每张骨牌两端各有从1到6的一个数字,现在要把这些骨牌排成一列,使相邻的两块骨牌相对的面所写的数字一样. 可以把每一块多米诺骨牌想象成一条边,把面上写的数字抽象成点,比如一块骨牌正面写的1反面写的2就想象成连了一条从1到2的边,那么这就是求一条有重边的欧拉回路了,dfs一下即可. 102:Coprimes给定n求从1到n中与n互质的数的个数. 可以把n质因数分解后直接代入欧拉函数.

VS Code 配置 前端

用户设置 打开 文件 > 首选项 > 用户设置(U),(忽略覆盖工作区提示) { // 控制字体系列. "editor.fontFamily": "Consolas, 'Courier New', monospace,'宋体'", // 以像素为单位控制字号. "editor.fontSize": 18, // 控制选取范围是否有圆角 "editor.roundedSelection": false, // 建议小

实时控制软件设计第二周作业-停车场门禁控制系统状态机

画出动作转换图为: 使用模块化设计,将起落杆.出入传感器和通行灯设计成四个模块,分别继承设计好的系统模块接口: 1 //FSM_Interface.h 2 #pragma once 3 4 namespace FSM 5 { 6 7 class ISystemUnit //系统单元接口 8 { 9 public: 10 11 virtual void Initialize() = 0; //初始化 12 13 virtual void Execute() = 0; //执行动作 14 15 vi

看到一个不错的机器人笔记本看书的动画,就做了做

效果大致如上图所示:由于PS技术不怎么精湛,能显示出大致效果,真正的html页面的效果要比这个gif图片好太多了. 上源码: 1 <!doctype html> 2 <html> 3 <head> 4 <title>纯css实现机器人看书</title> 5 <meta charset="utf-8"> 6 <style type="text/css"> 7 body,div{ 8

LED Decorative Light Supplier - LED Environmental Decorative Lighting Application

Creating ambient lighting in the home can bridge the gap between the internal world and the outside world. Why not use LED decorative lighting to paint the walls and let it feel your feelings? With LED ambient lighting effects and design, you can tur

CF149D. Coloring Brackets[区间DP !]

不知道为什么居中了,先把代码放这 #include<iostream> #include<cstdio> #include<algorithm> #include<cstring> using namespace std; const int N=705,MOD=1e9+7; char s[N]; long long n,f[N][N][5][5]; int st[N],top=0,m[N]; void match(){ for(int i=1;i<=

light oj 1236 【大数分解】

给定一个大数,分解质因数,每个质因子的个数为e1,e2,e3,--em, 则结果为((1+2*e1)*(1+2*e2)--(1+2*em)+1)/2. //light oj 1236 大数分解素因子 #include <stdio.h> #include <iostream> #include <string.h> #include <algorithm> #include <math.h> #include <ctype.h> #i

POJ 2955 Brackets (动规)

Brackets Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 2999   Accepted: 1536 Description We give the following inductive definition of a "regular brackets" sequence: the empty sequence is a regular brackets sequence, if s is a reg

Codeforces 552E Vanya and Brackets(贪心 + 表达式计算)

题目链接 Vanya and Brackets 题目大意是给出一个只由1-9的数.乘号和加号组成的表达式,若要在这个表达式中加上一对括号,求加上括号的表达式的最大值. 我们发现,左括号的位置肯定是最左端或者某个乘号右边,右括号的位置肯定是最右段或者某个乘号左边. 而乘号最多只有15个,那么暴力枚举就可以了. #include <bits/stdc++.h> using namespace std; #define rep(i, a, b) for (int i(a); i <= (b);