比赛 |
不平凡的世界 |
评测结果 |
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;
}