记录编号 98201 评测结果 AAAAAAAAAA
题目名称 导弹拦截 最终得分 100
用户昵称 Gravatar隨風巽 是否通过 通过
代码语言 C++ 运行时间 0.036 s
提交时间 2014-04-21 21:06:11 内存使用 0.35 MiB
显示代码纯文本
#include<iostream>
#include<cstdio>
#include<vector>
#include<cstring>
#include<cstdlib>
#include<algorithm>
using namespace std;
const int MAXN=1000+10;
struct point{int x,y,z;}mis[MAXN];
int N,f[MAXN];
int max(int a,int b){return a>b?a:b;}
vector<int>g[MAXN];
bool cmp(point a,point b)
{
	if(a.x<b.x)return true;
	if(a.x>b.x)return false;
	if(a.y<b.y)return true;
	if(a.y>b.y)return false;
	return a.z<b.z;
}
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",&mis[i].x,&mis[i].y,&mis[i].z);
	sort(mis+1,mis+1+N,cmp);
	//第一问
	for(i=1;i<=N;i++)f[i]=1;
	for(i=2;i<=N;i++)
	{
		for(j=i-1;j>=1;j--)
		{
			if(mis[i].x>mis[j].x&&mis[i].y>mis[j].y&&mis[i].z>mis[j].z)
				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(mis[i].x<mis[j].x&&mis[i].y<mis[j].y&&mis[i].z<mis[j].z)
				g[i].push_back(j);
	BPM.INITIALIZE(N,N);
	cout<<N-BPM.SOLVE()<<endl;
	return 0;
}