Codeforces #594 div1 B/div2 D2 – The World Is Just a Programming Task
时间:2019-11-06
本文章向大家介绍Codeforces #594 div1 B/div2 D2 – The World Is Just a Programming Task,主要包括Codeforces #594 div1 B/div2 D2 – The World Is Just a Programming Task使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
题目链接:https://codeforces.com/contest/1239/problem/B
题意:给你一个长度为n的括号字符串,将这个括号字符串围成一个环,问交换一次两个括号的位置,能使环中最多出现多少个正确的括号序列。
做法:很(我)有(不)意(会)思(做)的思维题。首先我们定义没有被任何括号包住的括号为一级括号,例如“()()()”就是3个一级括号,然后我们定义被一层一级括号包住的括号为二级括号,例如“(()())”就是一级括号里面有2个二级括号,最后我们定义被一层二级括号和一层一级括号包住的括号为三级括号,例如“((()()))”就是一级括号里面有1个二级括号里面有2个三级括号。当出现二级括号时,我们通过交换包住二级括号的一级括号两端可以把里面的二级括号放出来,例如“(()())”可以通过交换变为“)()()(”,但是代价是这个操作会将外面的其他括号包起来变成一个一级括号,操作期望为二级括号数+1。当出现三级括号时,我们通过交换包住三级括号的二级括号两端可以把里面的三级括号放出来,例如“((()()))”可以通过交换变为“()()()()”,但是代价时这个操作会将一级括号里的其他二级括号包起来变成2个一级括号,操作期望为三级括号数+一级括号数+1(还有一个是原来就存在的一级括号),具体实现见代码。
参考代码:
#include <iostream>
#include <stack>
using namespace std;
stack<int> S;
char str[600005];
int sum[600005], s[3][600005];
int main()
{
int n, pos = 1, cnt = 0, minn = 0;
cin >> n >> str + 1;
for (int i = 1; i <= n; ++i)
{
if (str[i] == '(')
cnt++;
else
cnt--;
if (cnt < minn)
{
minn = cnt;
pos = i + 1;
}
}
if (cnt)
{
cout << "0" << endl;
cout << "1 1" << endl;
return 0;
}
for (int i = n + 1; i <= 2 * n; ++i)
str[i] = str[i - n];
for (int i = pos; i < pos + n; ++i)
{
for (int j = 0; j < 3; ++j)
s[j][i] = s[j][i - 1];
if (str[i] == '(')
S.push(i);
else
{
S.pop();
if (S.empty())
s[0][i]++;
else if (S.size() == 1)
s[1][i]++;
else if (S.size() == 2)
s[2][i]++;
}
}
int ans = s[0][pos + n - 1], l = 1, r = 1;
for (int i = pos; i < pos + n; ++i)
{
if (str[i] == '(')
S.push(i);
else
{
int temp = S.top();
S.pop();
if (S.empty())
{
int tempone = s[1][i] - s[1][temp] + 1;
if (tempone > ans)
{
ans = tempone;
if (i % n)
r = i % n;
else
r = n;
if (temp % n)
l = temp % n;
else
l = temp;
}
}
else if (S.size() == 1)
{
int temptwo = s[2][i] - s[2][temp] + s[0][pos + n - 1] + 1;
if (temptwo > ans)
{
ans = temptwo;
if (i % n)
r = i % n;
else
r = n;
if (temp % n)
l = temp % n;
else
l = temp;
}
}
}
}
cout << ans << endl;
cout << l << " " << r << endl;
return 0;
}
原文地址:https://www.cnblogs.com/mapleaves/p/11808809.html
- 如何让nginx显示文件夹目录
- Facebook Graph API(2)--读取数据之picture
- 使用Dockerfile构建镜像-Docker for Web Developers(5)
- 2018年程序员的出路有哪些
- CSS魔法堂:不得不说的Containing Block
- Facebook Graph API(1)—介绍
- MongoDB学习系列(1)--入门介绍
- 2018年人工智能行业市场预测:市场规模有望突破200亿元大关
- Javascript对象的方法赋值
- CentOS挂载硬盘
- 使用jQuery UI的draggable和droppable完成拖拽功能--介绍
- Angular企业级开发(6)-使用Gulp构建和打包前端项目
- CSS魔法堂:重拾Border之——解构Border
- Angular企业级开发(7)-MVC之控制器
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Laravel框架文件上传功能实现方法示例
- python中如何写类
- 什么是PHP7中的孤儿进程与僵尸进程
- Python爬虫小例子——爬取51job发布的工作职位
- 详解PHP素材图片上传、下载功能
- Python enumerate() 函数如何实现索引功能
- python打开文件的方式有哪些
- PHP实现二维数组按照指定的字段进行排序算法示例
- python怎么自定义捕获错误
- Codeforces Round #677 (Div. 3)
- PHP PDOStatement::fetchObject讲解
- PHP PDOStatement::getAttribute讲解
- Laravel框架自定义验证过程实例分析
- Codeigniter里的无刷新上传的实现代码
- django ObjectDoesNotExist 和 DoesNotExist的用法