比赛 |
20140421 |
评测结果 |
AWWWWWAAWW |
题目名称 |
导弹拦截 |
最终得分 |
30 |
用户昵称 |
cstdio |
运行时间 |
0.060 s |
代码语言 |
C++ |
内存使用 |
0.36 MiB |
提交时间 |
2014-04-21 08:35:24 |
显示代码纯文本
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<vector>
using namespace std;
const int SIZEN=1010;
class POINT{
public:
int x,y,z;
};
bool inc(POINT a,POINT b){
return a.x<b.x&&a.y<b.y&&a.z<b.z;
}
bool noninc(POINT a,POINT b){
return a.x>=b.x&&a.y>=b.y&&a.z>=b.z;
}
int N;
POINT P[SIZEN];
int LISlen(bool (*cmp)(POINT,POINT)){
//cmp(前,后)一直true的最长序列
int f[SIZEN]={0};
int ans=0;
for(int i=1;i<=N;i++){
f[i]=0;
for(int j=1;j<i;j++){
if(cmp(P[j],P[i])){
f[i]=max(f[i],f[j]);
}
}
f[i]++;
ans=max(ans,f[i]);
}
return ans;
}
int match[SIZEN*2]={0};
bool visit[SIZEN*2]={0};
vector<int> c[SIZEN*2];
bool findpath(int x){
for(int i=0;i<c[x].size();i++){
int u=c[x][i];
if(!visit[u]){
visit[u]=true;
if(match[u]==-1||findpath(match[u])){
match[u]=x;
match[x]=u;
return true;
}
}
}
return false;
}
int COVnum(void){
int ans=0;
memset(match,-1,sizeof(match));
for(int i=1;i<=N;i++){
memset(visit,0,sizeof(visit));
if(findpath(i)) ans++;
}
return N-ans;
}
void makegraph(void){
for(int i=1;i<=N;i++){
for(int j=1;j<=N;j++){
if(inc(P[i],P[j])){
c[i].push_back(j+N);
c[j+N].push_back(i);
}
}
}
}
void work(void){
printf("%d\n",LISlen(inc));
makegraph();
printf("%d\n",COVnum());
}
void read(void){
scanf("%d",&N);
for(int i=1;i<=N;i++) scanf("%d%d%d",&P[i].x,&P[i].y,&P[i].z);
}
int main(){
freopen("bomba.in","r",stdin);
freopen("bomba.out","w",stdout);
read();
work();
return 0;
}