比赛 20140421 评测结果 AAAAAAEAEA
题目名称 导弹拦截 最终得分 80
用户昵称 GDFRWMY 运行时间 0.183 s
代码语言 C++ 内存使用 5.20 MiB
提交时间 2014-04-21 09:04:15
显示代码纯文本
#include<fstream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<cstdlib>
#include<algorithm>
#include<queue>
using namespace std;
ifstream fin("bomba.in");
ofstream fout("bomba.out");
class xxx{
public:
	int x,y,z;
};
xxx k[10000];
int n,ans,flag[10000],f[10000],sum,vis[10000],fa[10000];
int map[1100][1100];
bool operator <(xxx a,xxx b){
return (a.x < b.x && a.y < b.y && a.z < b.z);
}
/*void dfs(int x){
	for(int i=x+1;i<=n;i++)
		if (flag[i]==0&&k[x]<k[i]){
			flag[i]=1;
			dfs(i);
			return;
		}
}
	*/		
bool dfs(int x){
	for (int i=n;i<=n+n;i++){
		if (map[x][i]&&vis[i]==0){
			vis[i]=1;
            if (fa[i]==0||dfs(fa[i])){
            fa[i]=x;
            return true;
            }
	    }
	}
return false;
}
 
	

bool cmp(xxx a,xxx b){
	if (a.x < b.x) return 1;
    if (a.x > b.x) return 0;
    if (a.y < b.y) return 1;
    if (a.y > b.y) return 0;
	return a.z < b.z;
}	

int main(){
	fin>>n;
	for(int i=1;i<=n;i++)
		fin>>k[i].x>>k[i].y>>k[i].z;
	sort(k+1,k+n+1,cmp);
	f[1]=1;
	for(int i=2;i<=n;i++){
		f[i]=1;
		for (int j=1;j<i;j++)
			if (f[i]<f[j]+1&&k[j]<k[i])
				f[i]=f[j]+1;
	}
	ans=0; 
	for(int i=1;i<=n;i++) if (ans<f[i]) ans=f[i];
    fout<<ans<<endl;
	ans=0;
	/*for(int i=1;i<=n;i++)
		if (flag[i]==0){
			ans++;
			flag[i]=1;
			dfs(i);
		}
	fout<<ans;*/
	for(int i=1;i<=n;i++)
		for(int j=1;j<=n;j++)
			if (k[i]<k[j])
				map[i][j+n]=map[i+n][j]=1;
	for(int i=1;i<=n;i++){
		memset(vis,0,sizeof(vis));
		if (dfs(i)) sum++;
	}
	fout<<n-sum;
	
return 0;
}