热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

拦截导弹题解

DescriptionGGF最近经常遭到不明导弹的袭击,因此他只好开发了一套导弹拦截系统。该系统非常先进,使用会拐弯的激光对导弹进行射击。-_-所有被激光击中的导弹就瞬

Description

  GGF最近经常遭到不明导弹的袭击,因此他只好开发了一套导弹拦截系统。
  该系统非常先进,使用会拐弯的激光对导弹进行射击。-_-
  所有被激光击中的导弹就瞬间完蛋,而且一束激光可以同时摧毁多枚导弹。
  但激光只能向上发射,所以若同一束激光能依次击中多枚导弹,则这些导弹坐标的每一维都严格单调上升。建立了一个三维坐标系后:
  假设4枚导弹坐标为:(0, 0, 0) (1, 1, 0) (1, 1, 1), (2, 2, 2)
  则一束激光可以依次击毁1,3,4号导弹,却不能依次击毁1,2,4,也不能依次击毁4,3,1。
  现在,GGF发现N枚导弹正向自己飞来。-_-
  在定位了导弹的坐标后,他想知道,只发射一束激光最多可以摧毁多少枚导弹,若要摧毁所有导弹,至少需要发射多少束激光。(激光速度极快,所以可以认为导弹在那一瞬间静止,而且激光间不相互影响)

Input

  输入文件第一行一个正整数N(1<=N<=2000)。
  下面N行,每行3个整数Xi,Yi,Zi(0<=Xi,Yi,Zi<=10^6) ,描述一个导弹的坐标。

Output

  两行,第一行一个整数表示最多可以拦截多少枚导弹。
  第二行一个整数表示最少发射多少束激光才能拦截全部导弹。

Sample Input

4
1 2 3
1 1 1
2 5 4
0 1 1

Sample Output

3
2

Data Constraint

Hint

【数据规模】
  对于20%的数据,有N<=10。
  对于50%的数据,有N<=300。
  对于100%的数据如题。

题解

发现导弹的打击关系可以变成一个无环dag
那么最多打多少导弹就是求dag中的最长路径。
多少套系统就是求最小路径覆盖。

最小路径覆盖=n-最大匹配。

所以跑一遍bfs和匈牙利即可。

type aa=record
  x,y,z:longint;
end;
var n,i,j,k,l,tot,tot1,ans:longint;
d,head,head1,f,bz,g,r:array[0..100000]of longint;
next,next1,t,t1:array[0..4000000]of longint;
a:array[0..100000]of aa;
procedure sort(l,r:longint);
var i,j,kx,ky,kz:longint;
begin
  i:=l;
  j:=r;
  kx:=a[(l+r)div 2].x;
  ky:=a[(l+r)div 2].y;
  kz:=a[(l+r)div 2].z;
  repeat
    while (a[i].xor((a[i].x=kx)and(a[i].yor((a[i].x=kx)and(a[i].y=ky)and(a[i].zdo inc(i);
    while (a[j].x>kx)or((a[j].x=kx)and(a[j].y>ky))or((a[j].x=kx)and(a[j].y=ky)and(a[j].z>kz)) do dec(j);
    if i<=j then begin
      a[0]:=a[i];
      a[i]:=a[j];
      a[j]:=a[0];
      inc(i);
      dec(j);
    end;
  until i>j;
  if ithen sort(i,r);
  if j>l then sort(l,j);
end;
procedure ad(x,y:longint);
begin
  inc(tot);
  next[tot]:=head[x];
  head[x]:=tot;
  t[tot]:=y;
end;
procedure ad1(x,y:longint);
begin
  inc(tot1);
  next1[tot1]:=head1[x];
  head1[x]:=tot1;
  t1[tot1]:=y;
end;
procedure bfs;
var i,j,k,l:longint;
begin
  k:=0;
  for i:=1 to n do if r[i]=0 then begin
    inc(k);
    d[k]:=i;
    f[i]:=1;
  end;
  i:=0;
  while ido begin
    inc(i);
    j:=head[d[i]];
    while j<>0 do begin
      f[t[j]]:=f[d[i]]+1;
      dec(r[t[j]]);
      if r[t[j]]=0 then begin
        inc(k);
        d[k]:=t[j];
      end;
      j:=next[j];
    end;
  end;
  ans:=f[d[n]];
end;
function dfs(x:longint):longint;
var j:longint;
begin
  if bz[x]=i then exit(0);
  bz[x]:=i;
  j:=head1[x];
  while j<>0 do begin
    if (g[t1[j]]=0)or(dfs(g[t1[j]])=1) then begin
      g[t1[j]]:=x;
      exit(1);
    end;
    j:=next1[j];
  end;
  exit(0);
end;
begin
  readln(n);
  for i:=1 to n do readln(a[i].x,a[i].y,a[i].z);
  sort(1,n);
  for i:=2 to n do begin
    for j:=1 to i-1 do begin
      if (a[i].x>a[j].x)and(a[i].y>a[j].y)and(a[i].z>a[j].z) then begin
        ad(j,i);
        inc(r[i]);
        ad1(j,i+n);
      end;
    end;
  end;
  bfs;
  writeln(ans);
  ans:=0;
  for i:=1 to n do ans:=ans+dfs(i);
  writeln(n-ans);
end.

推荐阅读
  • 前言--页数多了以后需要指定到某一页(只做了功能,样式没有细调)html ... [详细]
  • 本文将介绍如何编写一些有趣的VBScript脚本,这些脚本可以在朋友之间进行无害的恶作剧。通过简单的代码示例,帮助您了解VBScript的基本语法和功能。 ... [详细]
  • 本文详细介绍了如何在Linux系统上安装和配置Smokeping,以实现对网络链路质量的实时监控。通过详细的步骤和必要的依赖包安装,确保用户能够顺利完成部署并优化其网络性能监控。 ... [详细]
  • 本文介绍了如何使用JQuery实现省市二级联动和表单验证。首先,通过change事件监听用户选择的省份,并动态加载对应的城市列表。其次,详细讲解了使用Validation插件进行表单验证的方法,包括内置规则、自定义规则及实时验证功能。 ... [详细]
  • 本文详细解析了Python中的os和sys模块,介绍了它们的功能、常用方法及其在实际编程中的应用。 ... [详细]
  • 本文详细介绍了Java中org.neo4j.helpers.collection.Iterators.single()方法的功能、使用场景及代码示例,帮助开发者更好地理解和应用该方法。 ... [详细]
  • 优化ListView性能
    本文深入探讨了如何通过多种技术手段优化ListView的性能,包括视图复用、ViewHolder模式、分批加载数据、图片优化及内存管理等。这些方法能够显著提升应用的响应速度和用户体验。 ... [详细]
  • 本文详细介绍如何使用Python进行配置文件的读写操作,涵盖常见的配置文件格式(如INI、JSON、TOML和YAML),并提供具体的代码示例。 ... [详细]
  • 本文探讨了Hive中内部表和外部表的区别及其在HDFS上的路径映射,详细解释了两者的创建、加载及删除操作,并提供了查看表详细信息的方法。通过对比这两种表类型,帮助读者理解如何更好地管理和保护数据。 ... [详细]
  • 本文详细介绍了如何使用 Yii2 的 GridView 组件在列表页面实现数据的直接编辑功能。通过具体的代码示例和步骤,帮助开发者快速掌握这一实用技巧。 ... [详细]
  • 本文深入探讨了 Java 中的 Serializable 接口,解释了其实现机制、用途及注意事项,帮助开发者更好地理解和使用序列化功能。 ... [详细]
  • Python自动化处理:从Word文档提取内容并生成带水印的PDF
    本文介绍如何利用Python实现从特定网站下载Word文档,去除水印并添加自定义水印,最终将文档转换为PDF格式。该方法适用于批量处理和自动化需求。 ... [详细]
  • XNA 3.0 游戏编程:从 XML 文件加载数据
    本文介绍如何在 XNA 3.0 游戏项目中从 XML 文件加载数据。我们将探讨如何将 XML 数据序列化为二进制文件,并通过内容管道加载到游戏中。此外,还会涉及自定义类型读取器和写入器的实现。 ... [详细]
  • 本章将深入探讨移动 UI 设计的核心原则,帮助开发者构建简洁、高效且用户友好的界面。通过学习设计规则和用户体验优化技巧,您将能够创建出既美观又实用的移动应用。 ... [详细]
  • 扫描线三巨头 hdu1928hdu 1255  hdu 1542 [POJ 1151]
    学习链接:http:blog.csdn.netlwt36articledetails48908031学习扫描线主要学习的是一种扫描的思想,后期可以求解很 ... [详细]
author-avatar
夜凄凉2502887267
这个家伙很懒,什么也没留下!
Tags | 热门标签
RankList | 热门文章
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有