比赛 不平凡的世界 评测结果 AAATTTTTTT
题目名称 不平凡的boss 最终得分 30
用户昵称 TZJerry 运行时间 7.284 s
代码语言 C++ 内存使用 3.18 MiB
提交时间 2015-11-05 11:35:18
显示代码纯文本
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
struct node
{
	int name;
	int wuli;
	int mofa;
	int jingshen;
}mon[100100];
bool die[100100];  //确定第i个小怪的生湿
int sorwuli[100100];
int sormofa[100100];
bool dead[100100];
int sorjingshen[100100];
int n,flag,minn=999999999;
bool mywuli(node a,node b)
{
	return a.wuli<b.wuli;
}
bool mymofa(node a,node b)
{
	return a.mofa<b.mofa;
}
bool myjingshen(node a,node b)
{
	return a.jingshen<b.jingshen;
}
bool my(node a,node b)
{
	return a.name<b.name;
}
void doit()
{
	for(int i=1;i<=n;i++)
	{	
		scanf("%d%d%d",&mon[i].wuli,&mon[i].mofa,&mon[i].jingshen);
		mon[i].name=i;   //
	}
	sort(mon+1,mon+n+1,mywuli);
	for(int i=1;i<=n;i++) sorwuli[i]=mon[i].name;
	sort(mon+1,mon+n+1,mymofa);
	for(int i=1;i<=n;i++) sormofa[i]=mon[i].name;
	sort(mon+1,mon+n+1,my);  //sort完了要还原
	for(int i=1;i<=n;i++)  //假设物理伤害打湿i个小怪。那么n-i个交给魔法
	{
		memset(die,false,sizeof(die));
		flag=0;
		for(int j=1;j<=i;j++)
		{
			die[sorwuli[j]]=true;
		}
		flag=flag+mon[sorwuli[i]].wuli;
		for(int j=n;j>=1;j--)
		{
			if(die[sormofa[j]]==false)
			{
				flag=flag+mon[sormofa[j]].mofa;
				break;
			}
		}
		if(minn>flag) minn=flag;
	}
}
void doits()
{
	for(int i=1;i<=n;i++)
	{	
		scanf("%d%d%d",&mon[i].wuli,&mon[i].mofa,&mon[i].jingshen);
		mon[i].name=i;   //
	}
	sort(mon+1,mon+n+1,mywuli);
	for(int i=1;i<=n;i++) sorwuli[i]=mon[i].name;
	sort(mon+1,mon+n+1,mymofa);
	for(int i=1;i<=n;i++) sormofa[i]=mon[i].name;
	sort(mon+1,mon+n+1,myjingshen);
	for(int i=1;i<=n;i++) sorjingshen[i]=mon[i].name;
	sort(mon+1,mon+n+1,my);
	for(int i=1;i<=n;i++)
	{
		int q;
		memset(die,false,sizeof(die));
		flag=0;
		for(int p=1;p<=i;p++) die[sorwuli[p]]=true;
		for(int p=1;p<=n;p++) dead[p]=die[p];
		flag=flag+mon[sorwuli[i]].wuli;
		q=flag;
		for(int j=1;j<=n-i;j++)
		{
			flag=q;
			for(int p=1;p<=n;p++) die[p]=dead[p];
			int sum=0;
			for(int p=1;;p++)
			{
				if(die[sormofa[p]]==false)
				{
					die[sormofa[p]]=true;
					sum++;
					if(sum==j)
					{
						flag=flag+mon[sormofa[p]].mofa;
						break;
					}
				}
			}
			for(int k=n;k>=1;k--)
			{
				if(die[sorjingshen[k]]==false)
				{
					flag=flag+mon[sorjingshen[k]].jingshen;
					break;
				}
			}
			if(flag<minn) minn=flag;
		}
	}
}
int main()
{
	freopen("playwithboss.in","r",stdin);
	freopen("playwithboss.out","w",stdout);
	cin>>n;
	if(n<=300) doits();
	else doit();
	cout<<minn<<endl;
	return 0;
}