CodeForces - 1323C Unusual Competitions(贪心)

题目链接:点击查看

题目大意:给出一个长度为 n 的括号序列,现在允许的操作是对于一段区间 [ l , r ] 内的括号重新排列,所需要的花费为区间长度,问如果想要使得括号序列变为正确的形式,最少花费为多少

题目分析:括号的正常形式不用多啰嗦了吧,无非就是必须满足全都匹配,无非法嵌套等等,比较简单的贪心,讲一下如何贪心吧,O( n )扫一遍字符串,如果遇到了左括号,先保存起来,后续遇到了右括号时,如果前面已经有了保存的左括号,那么可以抵消,则对答案没有贡献,但如果前面没有保存的左括号时,说明这个位置开始,括号序列需要重新排序,那么我们贪心去找最靠近这个位置的左括号来和这个右括号匹配,找到后使整个区间重新排序就好了,至于找到的标准,就是左括号的数量等于右括号的数量,具体的看代码也就能够理解了,在进行操作之前记得判断一下 -1 ,也就是整个序列中左括号的数量与右括号的数量不相等

代码:

#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;
      
typedef long long LL;
     
typedef unsigned long long ull;
      
const int inf=0x3f3f3f3f;
 
const int N=1e6+100;

int n;

char s[N];

bool check()
{
	int cnt1=0,cnt2=0;
	for(int i=0;i

 

你可能感兴趣的:(贪心,CodeForces上分)