(待补)
A. Pieces of Parentheses
将括号处理完成后排序,方式参加下面的博客。然后做一遍背包即可。
2018 Multi-University Training Contest 1 Balanced Sequence(贪心)
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
using namespace std;
const int maxn=300+10;
struct Node
{
int l,r,have;
int c;
bool operator<(const Node& rhs)const
{
if(c==0&&rhs.c==0) return ((l-r)>(rhs.l-rhs.r))||((l-r)==(rhs.l-rhs.r)&&l>rhs.l);
else return c>rhs.c;
}
} node[maxn];
int n;
char s[maxn];
int f[maxn][100000+10];
int Max;
int main()
{
scanf("%d",&n);
Max=0;
for(int i=1; i<=n; i++)
{
scanf("%s",s);
int len=strlen(s);
int l=0,r=0,res=0;
for(int j=0; j<len; j++)
{
if(s[j]=='(') l++, Max++;
else
{
if(l) l--, res++;
else r++;
}
}
node[i].l=l, node[i].r=r, node[i].have=res*2;
if(node[i].l&&node[i].r==0) node[i].c=1;
else if(node[i].l==0&&node[i].r) node[i].c=-1;
else node[i].c=0;
}
sort(node+1,node+1+n);
memset(f, -1, sizeof(f));
f[1][0]=0;
for(int i=1; i<=n; i++)
for(int j=0; j<=Max; j++)
if(f[i][j]!=-1)
{
f[i+1][j]=max(f[i+1][j],f[i][j]);
if(node[i].r<=j)
f[i+1][j+node[i].l-node[i].r]=max(f[i+1][j+node[i].l-node[i].r],f[i][j]+node[i].have+2*node[i].r);
}
printf("%d\n",f[n+1][0]);
return 0;
}
B. Stars in a Can
C. Stretching Streamers
D. Heaps from Trees
E. Blazing New Trails
可以二分一个值,然后将所有的特殊边减去这个值,看最小生成树满不满足条件。
F. Incremental Double Free Strings
G. Apple Market
H. Maximum Color Clique
I. Ski Resort
J. Yin and Yang Stones
每次操作消去一个 "B" 和 "W",而且这样的消去操作与位置是无关的。所以直接判个数相等。
K. Unbalanced Parentheses