D - The World Is Just a Programming Task (Easy Version)思维
Posted goto_1600
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了D - The World Is Just a Programming Task (Easy Version)思维相关的知识,希望对你有一定的参考价值。
题意:
有一个括号序列,你可以选择两个位置i,j(i可以等于j),进行交换。使得最后的循环位置(i的数目)最大。
循环位置:i(0<=i<len),将前i个字符移到最后,得到的新序列是合法的括号序列。
)()()( 的循环位置有 1、3、5
)((()))( 的循环位置有 1、7
思路:
由于n很小,我们可以先暴力枚举交换的位置i,j,然后o(n)记录答案,如何on记录答案呢,我们定义前缀值,为遇到左括号+1,遇到右括号-1,当然如果最终的前缀值不为0,显然这种情况肯定不是最佳的,这题其实是有一个结论的,答案就是前缀的最小值的个数,下面我们来证明一下,反证法:如果不是前缀的最小值,那么也就是比它大,假设这个前缀的最小值不在这个范围内,那么就是该前缀不满足括号序列的左括号数大于等于右括号数;反之,如果在当前枚举的范围内,也就是包括在其中,那么不包括前缀的后半部分左括号肯定大于右括号,放入后缀中就没有人和他匹配了,也不成立。
代码:
#include<iostream>
#include<cstring>
#include<algorithm>
#include<set>
#include<vector>
using namespace std;
const int N=510;
typedef long long ll;
int sum[N][2];
int main()
{
int n;
string s;
cin>>n>>s;
s=' '+s;
int maxv=0;
int o1=1;
int o2=1;
for(int i=1;i<=n;i++)
{
for(int j=i;j<=n;j++)
{
string ss=s;
swap(ss[i],ss[j]);
memset(sum,0,sizeof sum);
int lc=0;
int rc=0;
bool flag=1;
int tt=0;
bool ff=1;
int minv=0;
for(int k=1;k<=n;k++)
{
if(ss[k]=='(') lc++;
else lc--;
minv=min(minv,lc);
}
if(lc)
flag=0;
/*
if(i==1 && j==10)
{
cout<<ss<<endl;
for(int k=1;k<=n;k++)
cout<<sum[k][0]<<" "<<sum[k][1]<<endl;
}
*/
if(flag)
{
int lc=0;
int ct=0;
for(int k=1;k<=n;k++)
{
if(ss[k]=='(') lc++;
else lc--;
if(lc==minv)
ct++;
}
if(ct>maxv)
{
maxv=ct;
o1 = i;
o2 = j;
}
}
}
}
cout<<maxv<<endl;
cout<<o1<<" "<<o2<<endl;
return 0;
}
以上是关于D - The World Is Just a Programming Task (Easy Version)思维的主要内容,如果未能解决你的问题,请参考以下文章
[2016-3-29]OMG美语每日笔记-What would you say if you start feel like the other person is just not in the m
IBM: For Blockchain, Food Safety Is Just the Beginning
CodeForces - 131C The World is a Theatre(组合数)