【问题描述】
一场战争正在 A 国与 B 国之间如火如荼的展开。
B 国凭借其强大的经济实力开发出了无数的远程攻击导弹,B 国的领导人希望,通过这些导弹直接毁灭 A 国的指挥部,从而取得战斗的胜利!当然,A 国人民不会允许这样的事情发生,所以这个世界上还存在拦截导弹。
现在,你是一名 A 国负责导弹拦截的高级助理。B 国的导弹有效的形成了三维立体打击,我们可以将这些导弹的位置抽象三维中间的点(大小忽略),为了简单起见,我们只考虑一个瞬时的状态,即他们静止的状态。
拦截导弹设计非常精良,可以精准的引爆对方导弹而不需要自身损失,但是 A 国面临的一个技术难题是,这些导弹只懂得直线上升。精确的说,这里的直线上升指 xyz 三维坐标单调上升。给所有的 B 国导弹按照 1 至 N 标号,一枚拦截导弹可以打击的对象可以用一个 xyz 严格单调上升的序列来表示,例如:B 国导弹位置:(0, 0, 0) (1, 1, 0) (1, 1, 1), (2, 2, 2)一个合法的打击序列为:{1, 3, 4}一个不合法的打击序列为{1, 2, 4}
A 国领导人将一份导弹位置的清单交给你,并且向你提出了两个最简单不过的问题(假装它最简单吧):
1.一枚拦截导弹最多可以摧毁多少 B 国的导弹?
2.最少使用多少拦截导弹才能摧毁 B 国的所有导弹?
不管是为了个人荣誉还是国家容易,更多的是为了饭碗,你,都应该好好的把这个问题解决掉!
【输入文件】
第一行一个整数 N 给出 B 国导弹的数目。
接下来 N 行每行三个非负整数 Xi, Yi, Zi 给出一个导弹的位置,你可以假定任意两个导弹不会出现在同一位置。
【输出文件】
输出文件有且仅有两行。
第一行输出一个整数 P,表示一枚拦截导弹之多能够摧毁的导弹数。
第二行输出一个整数 Q,表示至少需要的拦截导弹数目。
【输入输出样例】
输入
4
0 0 0
1 1 0
1 1 1
2 2 2
输出
3
2
【数据范围】
所有的坐标都是[0,10 6 ]的整数
对于 30%的数据满足 N < 31
对于 50%的数据满足 N < 101
对于 100%的数据满足 N < 1001


我们按照先后顺序连出一张DAG,第一问求的就是最长链,DP,搜都没有什么问题。第二问问要多少枚导弹,这不就是问这张DAG需要多少条路才能被完全覆盖,问题转换为可以走重复路径最小路径覆盖问题,网络流或匈牙利算法解决(若果你不会最小路径覆盖:http://www.cnblogs.com/Dragon-Light/p/5604865.html)


 #include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstdlib>
#include<algorithm>
#include<vector>
#include<cmath>
#include<ctime>
#include<cstring>
#define llg int
#define maxn 3010
#define md 1001000
using namespace std;
int dl[md+],n,m,a[maxn][maxn],bj[maxn],ans=,x,used[maxn],girl[maxn],y,i,j,k,f[maxn][maxn],val[maxn],deep[maxn],head,tail;
vector<llg>g[maxn];
struct node
{
llg a1,a2,a3;
}c[maxn]; bool find(llg x)
{
for (llg i=;i<=n*;i++)
{
if (a[x][i] && !used[i])
{
used[i]=;
if (!girl[i] || find(girl[i]))
{
girl[i]=x;
return true;
}
}
}
return false;
} llg BFS(llg x)
{
for (llg i=;i<=n;i++) bj[i]=;
dl[]=x,head=,tail=; llg maxl=,w; deep[x]=;
do
{
head=(head % md)+;
x=dl[head]; bj[x]=;
maxl=max(maxl,deep[x]);
w=g[x].size();
for (llg i=;i<w;i++)
if (deep[g[x][i]]<deep[x]+)
{
deep[g[x][i]]=deep[x]+;
if (!bj[g[x][i]])
{
deep[g[x][i]]=deep[x]+;
tail=(tail % md)+;
dl[tail]=g[x][i];
}
}
}while (head!=tail);
return maxl;
} int main()
{
//yyj("bomb");
cin>>n;
for (i=;i<=n;i++) scanf("%d%d%d",&c[i].a1,&c[i].a2,&c[i].a3);
for (i=;i<=n;i++)
for (j=;j<=n;j++)
if (c[i].a1<c[j].a1 && c[i].a2<c[j].a2 && c[i].a3<c[j].a3)
{
f[i][j]=;
g[i].push_back(j);
val[j]++;
}
for (i=;i<=n;i++)
if (val[i]==) ans=max(BFS(i),ans);
cout<<ans<<endl;
/* for (k=1;k<=n;k++)
for (i=1;i<=n;i++)
for (j=1;j<=n;j++)
f[i][j]=f[i][j] || (f[i][k] && f[k][j]);*/
for (i=;i<=n;i++)
for (j=;j<=n;j++)
if (i!=j && f[i][j]) a[i][n+j]=;
ans=;
for (i=;i<=n*;i++)
{
memset(used,,sizeof(used));
if (find(i)) ans++;
}
cout<<n-ans;
return ;
}

codevs1409 拦截导弹2的更多相关文章

  1. nyoj814_又见拦截导弹_DP

    又见拦截导弹 时间限制:3000 ms  |  内存限制:65535 KB 难度:3   描述 大家对拦截导弹那个题目应该比较熟悉了,我再叙述一下题意:某国为了防御敌国的导弹袭击,新研制出来一种导弹拦 ...

  2. 【动态规划】拦截导弹_dilworth定理_最长递增子序列

    问题 K: [动态规划]拦截导弹 时间限制: 1 Sec  内存限制: 256 MB提交: 39  解决: 10[提交][状态][讨论版] 题目描述 张琪曼:“老师,修罗场是什么?” 墨老师:“修罗是 ...

  3. ACM题目————又见拦截导弹

    描述 大家对拦截导弹那个题目应该比较熟悉了,我再叙述一下题意:某国为了防御敌国的导弹袭击,新研制出来一种导弹拦截系统.但是这种导弹拦截系统有一个缺陷:它的第一发炮弹能够到达任意的高度,但是以后每一发炮 ...

  4. nyoj------79拦截导弹

    拦截导弹 时间限制:3000 ms  |  内存限制:65535 KB 难度:3   描述 某国为了防御敌国的导弹袭击,发展中一种导弹拦截系统.但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到 ...

  5. 百练_2945 拦截导弹(DP)

    描述 某国为了防御敌国的导弹袭击,开发出一种导弹拦截系统.但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能高于前一发的高度.某天,雷达捕捉到敌国的导弹来袭 ...

  6. nyoj 79 拦截导弹

    拦截导弹 时间限制:3000 ms  |  内存限制:65535 KB 难度:3   描述 某国为了防御敌国的导弹袭击,发展中一种导弹拦截系统.但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到 ...

  7. bzoj 2244: [SDOI2011]拦截导弹 cdq分治

    2244: [SDOI2011]拦截导弹 Time Limit: 30 Sec  Memory Limit: 512 MBSec  Special JudgeSubmit: 237  Solved: ...

  8. tyvj P1209 - 拦截导弹 平面图最小割&&模型转化

    P1209 - 拦截导弹 From admin    Normal (OI)总时限:6s    内存限制:128MB    代码长度限制:64KB 背景 Background 实中编程者联盟为了培养技 ...

  9. 题目:[NOIP1999]拦截导弹(最长非递增子序列DP) O(n^2)和O(n*log(n))的两种做法

    题目:[NOIP1999]拦截导弹 问题编号:217 题目描述 某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统.但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发 ...

随机推荐

  1. 使用Photoshop不改变图片尺寸,保存图片到30K以下的解决办法

  2. New line

    The concepts of line feed (LF) and carriage return (CR) are closely associated, and can be either co ...

  3. left join on 和where条件的放置

    先看个例子 以下P1与S1是一对多的关系 结果分别是:1746,1748,1748,1277525,307 由此看出: P1 left join S1 on ... and ...是将S1表中数据先过 ...

  4. gradle使用

    查看子工程引用的jar包 gradle child_project:dependencies > dep.txt

  5. win8.1中安装sql2014 0x800F0906 【 Error while enabling Windows feature : NetFx3, Error Code : -2146498298 】

    安装sql2012 需要安装net3.5  没有的话 安装不成功 Error while enabling Windows feature : NetFx3, Error Code : -214649 ...

  6. webservice通信调用天气预报接口实例

    转载:http://www.cnblogs.com/warrior4236/p/5668449.html 一:环境搭建 1:新建一个java project工程weatherInf 2:引入相应的ja ...

  7. C# 不重复的随机数

    public int RabdomNumber() { num = new Random(Guid.NewGuid().GetHashCode()).Next(0, 40); return num; ...

  8. IFRAM随内部长宽高变化

    <iframe src="" id="iframe_CustomerVisitRecord" width="700" height=& ...

  9. FFmpeg相关资料

    编译: http://www.jianshu.com/p/147c03553e63 http://www.cocoachina.com/ios/20150514/11827.html http://c ...

  10. Manthan, Codefest 16 -A Ebony and Ivory

    time limit per test 2 seconds memory limit per test 256 megabytes input standard input output standa ...