Bracket Score ( AtCoder Grand Contest 048)

题解:贪心策略,一个偶数必然要匹配一个奇数,不然中间相差的个数不会构成一个完美括号匹配,初始对b数组进行求和sum,再次对奇数项、偶数项分别对a[i] - b[i]从大到小排序,然后两者都对sum相加(去除b数组中小值的影响) , 每次操作取最大值。

code:

/*
	time 2020/10/24
	author by Jade
*/

#include <bits/stdc++.h>
using namespace std;

typedef long long ll;
const int NMAX = 2e5 + 10;
const int MOD = 1e9 + 7;
int c[NMAX] , a[NMAX] , b[NMAX];
int main(int argc, char const *argv[])
{
	int n , val,a_ind =0, b_ind = 0;
	scanf("%d",&n);
	for(register int i = 1;i <= n;i++)	scanf("%d",c+i);
	ll ans = 0 , sum = 0;
	for(register int i = 1;i <= n;i++)
	{
		scanf("%d",&val);
		if(i & 1)
			a[++a_ind] = c[i] - val;
		else
			b[++b_ind] = c[i] - val;
		sum += val;
	}	

	ans = sum;
	sort(a + 1,a + a_ind + 1 , greater<int>());
	sort(b + 1,b + b_ind + 1 , greater<int>());
	for(register int i = 1;i <= a_ind;i++)
	{
		sum += a[i] + b[i];
		ans = max(ans , sum);
	}
	printf("%lld
",ans );
	return 0;
}
原文地址:https://www.cnblogs.com/lemon-jade/p/13867710.html