比赛 |
20140421 |
评测结果 |
WWWWWWAAWW |
题目名称 |
导弹拦截 |
最终得分 |
20 |
用户昵称 |
隨風巽 |
运行时间 |
0.025 s |
代码语言 |
C++ |
内存使用 |
0.35 MiB |
提交时间 |
2014-04-21 11:05:24 |
显示代码纯文本
#include<iostream>
#include<cstdio>
#include<vector>
#include<cstring>
#include<cstdlib>
#include<algorithm>
using namespace std;
const int MAXN=1000+10;
int N,x[MAXN],y[MAXN],z[MAXN],f[MAXN];
int max(int a,int b){return a>b?a:b;}
vector<int>g[MAXN];
struct KM
{
int n,m; // 左右顶点个数
int left[MAXN];
bool T[MAXN];// T[i]为右边第i个点是否已标记
void INITIALIZE(int n,int m)
{
this->n=n;this->m=m;
}
bool MATCH(int u)
{
int i,v,un=g[u].size();
for(i=0;i<un;i++)
{
v=g[u][i];
if(!T[v])
{
T[v]=true;
if(left[v]==-1||MATCH(left[v]))
{
left[v]=u;
return true;
}
}
}
return false;
}
int SOLVE(void)
{
memset(left,-1,sizeof(left));
int ans=0,u;
for(u=1;u<=n;u++)
{
memset(T,0,sizeof(T));
if(MATCH(u))ans++;
}
return ans;
}
};
KM BPM;
int main()
{
freopen("bomba.in","r",stdin);
freopen("bomba.out","w",stdout);
scanf("%d",&N);
int i,j,ans=0;
for(i=1;i<=N;i++)
scanf("%d%d%d",&x[i],&y[i],&z[i]);
//第一问
for(i=1;i<=N;i++)f[i]=1;
for(i=2;i<=N;i++)
{
for(j=i-1;j>=1;j--)
{
if(x[i]>x[j]&&y[i]>y[j]&&z[i]>z[j])
f[i]=max(f[j]+1,f[i]);
}
}
for(i=1;i<=N;i++)
ans=max(ans,f[i]);
cout<<ans<<endl;
//第二问
for(i=1;i<=N;i++)
for(j=i+1;j<=N;j++)
if(x[i]<x[j]&&y[i]<y[j]&&z[i]<z[j])
g[i].push_back(j);
BPM.INITIALIZE(N,N);
cout<<N-BPM.SOLVE()<<endl;
return 0;
}