CodeForces - 1248D1 (思维+暴力)
时间:2019-11-11
本文章向大家介绍CodeForces - 1248D1 (思维+暴力),主要包括CodeForces - 1248D1 (思维+暴力)使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
题意
有一个括号序列,你可以选择两个位置i,j(i可以等于j),进行交换。使得最后的循环位置(i的数目)最大。
循环位置:i(0<=i<len),将前i个字符移到最后,得到的新序列是合法的括号序列。
- )()()( 的循环位置有 1、3、5
- )((()))( 的循环位置有 1、7
思路
这题还有个大数据范围版本,那题思路太神仙了,我等凡人就学学暴力吧!这题有个结论,假设)为-1,(为+1,那么一个括号序列的循环匹配个数等于前缀和最小值的个数。证明参考某大佬的:
假设对于序列)()(
,它的前缀和是-1 0 -1 0
当上述前缀值<0时,这个前缀序列一定是不合法的。然后考虑什么时候把括号序列的一段前缀移到后面去是合法的。
首先你需要使得移动之后,前面的括号序列合法。也就是说你得把一段“连续的极长非合法前缀”找出来(对于样例是)
)。这个东西恰好在前缀和第一次取得最小值时取得(前缀和取-1
)。然后实际上你还可以在这个前缀后面接上一些“本身合法”的括号序列,像这样:)()
。后面那个合法的序列对答案没有影响,因此循环移位的数量就是前缀和最小值的数量。
然后我们就可以O(n^3)暴力啦!
代码
#include<bits/stdc++.h> using namespace std; #define inf 0x3f3f3f3f #define ll long long const int N=200005; const int mod=1e9+7; const double eps=1e-8; const double PI = acos(-1.0); #define lowbit(x) (x&(-x)) int n; string s; int solve() { int sum=0,mi=0,cnt=0; for(int i=0; i<n; i++) { if(s[i]=='(') cnt++; else cnt--; mi=min(cnt,mi); } cnt=0; for(int i=0;i<n;i++) { if(s[i]=='(') cnt++; else cnt--; if(cnt==mi) sum++; } return sum; } int main() { std::ios::sync_with_stdio(false); cin>>n>>s; int cnt=0; for(int i=0; i<n; i++) { if(s[i]=='(') cnt++; else cnt--; } if(cnt) { cout<<"0\n1 1"<<endl; return 0; } int ans=solve(); int l=1,r=1; for(int i=0;i<n;i++) { for(int j=i+1;j<n;j++) { swap(s[i],s[j]); int tmp=solve(); if(tmp>ans) { l=i,r=j; ans=tmp; } swap(s[i],s[j]); } } cout<<ans<<endl; cout<<l+1<<" "<<r+1<<endl; return 0; }
原文地址:https://www.cnblogs.com/mcq1999/p/11837943.html
- 每天学习一点儿算法--快速排序
- Mac在Hadoop的yarn上运行mapreduce报错ExitCodeException exitCode=127:
- 机器学习(3) -- 贝叶斯及正则化
- 一个通用爬虫思路(Python3)
- mac系统安装和配置redis
- brew install mysql 后设置密码
- 每天学习一点儿算法--递归
- 每天学习一点儿算法--选择排序
- 5个实用的Linux命令行技巧
- Python中的小魔法(二)
- flink与Spark的对比分析
- Spark自定义累加器的实现
- 每天学习一点儿算法--二分查找
- IntelliJ IDEA两种keymap快捷键方案Mac OS X和Mac OS X 10.5+的区别
- 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 数组属性和方法
- rk3399 wifi和eth0共存 调试
- 23条JavaScript初学者应知的最佳实践方法
- 黑板客爬虫闯关游戏
- Python自学成才之路 多进程开发
- Python自学成才之路 进程间通信
- android 功耗(1)---android 功耗分析方法和优化
- 为什么要写 tf.Graph().as_default()
- tf.get_variable_scope().reuse_variables() 的使用
- Tensorflow小技巧整理:
- Tensorflow学习笔记——Summary用法
- 神经网络优化(损失函数:自定义损失函数、交叉熵、softmax())
- C++ STL stack 用法
- 遍历string时 使用for(char& c : s) for(char c : s) 的区别
- vc dll静态函数导出
- 利用GDB调试 MSQL