比赛 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;
}