比赛 不平凡的世界 评测结果 WAWWAAAWWW
题目名称 不平凡的boss 最终得分 40
用户昵称 我只是来打个酱油…… 运行时间 1.789 s
代码语言 C++ 内存使用 3.75 MiB
提交时间 2015-11-05 11:49:05
显示代码纯文本
#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
struct node
{
	int a;int b;int c;
};
node monster[100100]={};
node line[100100]={};
node mine[100100]={};
int n,ans=0,tmp=0,k=0,t=0;
void cint(int i)
{
	mine[++t].a=line[i].a;	mine[t].b=line[i].b;	mine[t].c=line[i].c;
}
void cink(int i)
{
	line[++k].a=mine[i].a;	line[k].b=mine[i].b;	line[k].c=mine[i].c;
}
bool mycmp1(node x,node y)
{
	return (x.a>y.a||(x.a==y.a&&x.b>y.b)||(x.a==y.a&&x.b==y.b&&x.c>y.c));
}
bool mycmp2(node x,node y)
{
	return (x.b>y.b||(x.b==y.b&&x.a>y.a)||(x.b==y.b&&x.a==y.a&&x.c>y.c));
}
bool mycmp3(node x,node y)
{
	return (x.c>y.c||(x.c==y.c&&x.b>y.b)||(x.c==y.c&&x.b==y.b&&x.a>y.a));
}
void coppy()
{
	for (int i=1;i<=n;i++)
	{
		line[i].a=monster[i].a;
		line[i].b=monster[i].b;
		line[i].c=monster[i].c;
	}
	k=n;
}
void init()
{
	cin>>n;
	for (int i=1;i<=n;i++)
		scanf("%d%d%d",&monster[i].a,&monster[i].b,&monster[i].c);
}
void worka()
{
	int p=0,q=0,m=0;
	while (k!=0||t!=0)
	{
		for (;k!=0;k--)
		{
			if (p>=line[k].a||q>=line[k].b||m>=line[k].c)
				continue;
			int ta=line[k].a-p,tb=line[k].b-q,tc=line[k].c;
			if (ta<tb&&(tb==tc||ta<tc))
				p=line[k].a;
			else if (tb<ta&&(ta==tc||tb<tc))
				q=line[k].b;
			else if (ta==tb&&tb==tc)
				cint(k);
			else m=line[k].c;
		}
		memset(line,0,sizeof(line));
		for (;t!=0;t--)
		{
			if (p>=mine[t].a||q>=mine[t].b||m>=mine[t].c)
				continue;
			int ta=mine[t].a-p,tb=mine[t].b-q,tc=mine[t].c-m;
			if (ta<tb&&(ta<tc||tb==tc))
				p=mine[t].a;
			else if (tb<ta&&(tb<tc||ta==tc))
				q=mine[t].b;
			else if (ta==tb&&tb==tc)
				cink(t);
			else m=mine[t].c;
		}
		memset(mine,0,sizeof(mine));
	}
	tmp=p+q+m;
}
void workb()
{
	int p=0,q=0;
	while (k!=0||t!=0)
	{
		for (;k!=0;k--)
		{
			if (p>=line[k].a||q>=line[k].b)	continue;
			if (line[k].a-p>line[k].b-q)
				q=line[k].b;
			else if (line[k].a-p==line[k].b-q)
				cint(k);
			else p=line[k].a;
		}
		memset(line,0,sizeof(line));
		for (;t!=0;t--)
		{
			if (p>=mine[t].a||q>=mine[t].b)	continue;
			if (mine[t].a-p>mine[t].b-q)
				q=mine[t].b;
			else if (line[t].a-p==line[t].b-q)
				cink(t);
			else p=mine[t].a;
		}
		memset(mine,0,sizeof(mine));
	}
	tmp=p+q;
}
int main()
{
	freopen("playwithboss.in","r",stdin);
	freopen("playwithboss.out","w",stdout);
	
	init();
	
	if (monster[1].c==100000000)
	{
		sort(monster+1,monster+n+1,mycmp1);
		coppy();		workb();
		ans=tmp;
		sort(monster+1,monster+n+1,mycmp2);
		coppy();		workb();
		ans=min(ans,tmp);
	}
	else 
	{
		sort(monster+1,monster+n+1,mycmp1);
		coppy();		worka();
		ans=tmp;
		sort(monster+1,monster+n+1,mycmp2);
		coppy();		worka();
		ans=min(ans,tmp);
		sort(monster+1,monster+n+1,mycmp3);
		coppy();		worka();
		ans=min(ans,tmp);
	}
	cout<<ans<<endl;
	
	return 0;
}