导弹

线性dp

你离开我真会死。 提交于 2020-02-02 23:29:54
拦截导弹(acwing.1010) 【题意】:某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统。但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能高于前一发的高度。某天,雷达捕捉到敌国的导弹来袭。由于该系统还在试用阶段,所以只有一套系统,因此有可能不能拦截所有的导弹。输入导弹依次飞来的高度(雷达给出的高度数据是不大于30000的正整数,导弹数不超过1000),计算这套系统最多能拦截多少导弹,如果要拦截所有导弹最少要配备多少套这种导弹拦截系统。 【分析】:第一个输出直接LIS就行,对于第二个问要考虑贪心思想,考虑一个拦截系统,起最后一个的高度肯定越大越有利于后面的元素增加进来,所需要的系统肯定就越少。所以用一个g数组来维护其最小元素的最大值,元素的个数就是最终所需的最少的拦截系统的个数。 #include <cstdio> #include <algorithm> #include <cstdlib> using namespace std; const int maxn=1e3+10; int arr[maxn],t,dp[maxn]; int g[maxn]; int main() { int tot=0; while (~scanf("%d",&t)){ arr[++tot]=t; } int ans=0; for(int i=1

「Luogu P2487 && BZOJ 2244」拦截导弹

谁说我不能喝 提交于 2020-02-01 02:23:31
某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统。但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度、并且能够拦截任意速度的导弹,但是以后每一发炮弹都不能高于前一发的高度,其拦截的导弹的飞行速度也不能大于前一发。某天,雷达捕捉到敌国的导弹来袭。由于该系统还在试用阶段,所以只有一套系统,因此有可能不能拦截所有的导弹。 在不能拦截所有的导弹的情况下,我们当然要选择使国家损失最小、也就是拦截导弹的数量最多的方案。但是拦截导弹数量的最多的方案有可能有多个,如果有多个最优方案,那么我们会随机选取一个作为最终的拦截导弹行动蓝图。 我方间谍已经获取了所有敌军导弹的高度和速度,你的任务是计算出在执行上述决策时,每枚导弹被拦截掉的概率。 Luogu BZOJ 分析 这道题,恶心至极。 调了一天...... 从我第一次提交到 AC 的时间可以看出我调了多久,还不包括连样例都没过的时候。 第一问就是一个 dp 最大值,但它是三维的,我们可以用 CDQ 来解决。 麻烦在于第二问。 显然,一个点被选到的概率为经过改点的路径条数 / 在 LIS 上的总路径条数,而判断这个点是否在 LIS 上,我们可以通过对正反两面分别 CDQ 一次,求出 dp 值 f[i] ,并记录路径条数 g[i] 。 如果当前节点满足 \(f[i][0]+f[i][1]-1=\max f[j][0](j\in [1

Day9 - H - 最少拦截系统 HDU - 1257

天大地大妈咪最大 提交于 2020-01-30 22:11:56
某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统.但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能超过前一发的高度.某天,雷达捕捉到敌国的导弹来袭.由于该系统还在试用阶段,所以只有一套系统,因此有可能不能拦截所有的导弹. 怎么办呢?多搞几套系统呗!你说说倒蛮容易,成本呢?成本是个大问题啊.所以俺就到这里来求救了,请帮助计算一下最少需要多少套拦截系统. Input输入若干组数据.每组数据包括:导弹总个数(正整数),导弹依此飞来的高度(雷达给出的高度数据是不大于30000的正整数,用空格分隔) Output对应每组数据输出拦截所有导弹最少要配备多少套这种导弹拦截系统. Sample Input 8 389 207 155 300 299 170 158 65 Sample Output 2思路:简单的贪心即可,有一个不满足条件就增加一个装置,每次都扫描已经增加的装置 const int maxm = 3e5+5; int val, n, build[maxm], cnt; void run_case() { cnt = 0; cin >> val; build[cnt++] = val; for(int i = 1; i < n; ++i) { cin >> val; bool flag = true; for(int j = 0; j

HDUOJ 1257 最少拦截系统 解题报告

浪尽此生 提交于 2020-01-22 16:45:53
HDUOJ 1257 最少拦截系统 解题报告 解题思路:把系统当成一个有耐久度的物品,初始值是其耐久最大值,之后根据导弹高度不断更新耐久值,如果导弹高度大于其剩余耐久值,就新开一个系统并初始化,最后把系统总数输出就行了。 不过有坑人的地方,举个例子:一个系统剩余耐久度100,新导弹110,那我们开个110的系统防御,然后又依次来了95和105的两颗导弹,那么我们必须用100的对付95的,再用110对付105的,不然就会再开一个系统造成浪费。 # include <iostream> # include <math.h> # include <iomanip> # include <algorithm> # include <queue> # include <cstring> # include <string> # include <map> # include <stack> # include <stdio.h> # include <cstdio> # include <stdlib.h> # include <fstream> # include <iomanip> # pragma warning(disable:4996) # define INF 0x3f3f3f3f # define ll long long # define PI acos(-1.0)

AcWing 187 导弹防御系统

会有一股神秘感。 提交于 2020-01-22 03:31:11
题目描述: 为了对抗附近恶意国家的威胁,R国更新了他们的导弹防御系统。 一套防御系统的导弹拦截高度要么一直 严格单调 上升要么一直 严格单调 下降。 例如,一套系统先后拦截了高度为3和高度为4的两发导弹,那么接下来该系统就只能拦截高度大于4的导弹。 给定即将袭来的一系列导弹的高度,请你求出至少需要多少套防御系统,就可以将它们全部击落。 输入格式 输入包含多组测试用例。 对于每个测试用例,第一行包含整数n,表示来袭导弹数量。 第二行包含n个不同的整数,表示每个导弹的高度。 当输入测试用例n=0时,表示输入终止,且该用例无需处理。 输出格式 对于每个测试用例,输出一个占据一行的整数,表示所需的防御系统数量。 数据范围 1≤n≤50 输入样例: 5 3 5 2 4 1 0 输出样例: 2 样例解释 对于给出样例,最少需要两套防御系统。 一套击落高度为3,4的导弹,另一套击落高度为5,2,1的导弹。 分析: 如果所有导弹防御系统拦截高度都是严格单调上升的,我们采取贪心的思路就是,如果所有系统的最小高度均不小于当前飞来导弹的高度,则新建一套系统;如果存在小于当前导弹高度的系统,则选择其中正确发射导弹高度最高的那个去击落该导弹。转换成LIS就是,如果当前上升子序列中所有序列的末元素均不小于遍历到的元素,则新建一个上升子序列;如果所有上升子序列中存在末元素小于遍历到的元素

最少拦截系统 HDU - 1257 动态规划入门

倖福魔咒の 提交于 2019-12-10 09:41:21
某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统.但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能超过前一发的高度.某天,雷达捕捉到敌国的导弹来袭.由于该系统还在试用阶段,所以只有一套系统,因此有可能不能拦截所有的导弹. 怎么办呢?多搞几套系统呗!你说说倒蛮容易,成本呢?成本是个大问题啊.所以俺就到这里来求救了,请帮助计算一下最少需要多少套拦截系统. Input 输入若干组数据.每组数据包括:导弹总个数(正整数),导弹依此飞来的高度(雷达给出的高度数据是不大于30000的正整数,用空格分隔) Output 对应每组数据输出拦截所有导弹最少要配备多少套这种导弹拦截系统. Sample Input 8 389 207 155 300 299 170 158 65 Sample Output 2 AC的C++程序如下: #include<bits/stdc++.h> using namespace std; const int MAXN=10000; int n,high[MAXN]; int LIS(){ int ans=1; int dp[MAXN]; dp[1]=1; for(int i=2;i<=n;i++) { int max=0; for(int j=1;j<i;j++) { if(dp[j]>max&&high[j]<high

最少拦截系统

天涯浪子 提交于 2019-12-05 12:10:27
最少拦截系统 Time Limit: 1000 ms Memory Limit: 65536 KiB Problem Description 某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统.但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能超过前一发的高度.某天,雷达捕捉到敌国的导弹来袭.由于该系统还在试用阶段,所以只有一套系统,因此有可能不能拦截所有的导弹. 怎么办呢?多搞几套系统呗!你说说倒蛮容易,成本呢?成本是个大问题啊.所以俺就到这里来求救了,请帮助计算一下最少需要多少套拦截系统. Input 输入若干组数据.每组数据包括:导弹总个数(正整数),导弹依此飞来的高度(雷达给出的高度数据是不大于30000的正整数,用空格分隔) Output 对应每组数据输出拦截所有导弹最少要配备多少套这种导弹拦截系统. Sample Input 8 389 207 155 300 299 170 158 65 Sample Output 2 Hint Source 1 #include<bits/stdc++.h> 2 using namespace std; 3 int main() 4 { 5 int n,num; 6 vector<int> data; 7 while(cin>>n){ 8 data.clear(); 9 for(int i

hdu1257最少拦截系统 贪心

主宰稳场 提交于 2019-12-05 03:03:45
  题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1257    某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统.但是这种导弹拦截系统有一个缺陷:虽 然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能超过前一发的高度.某天,雷 达捕捉到敌国的导弹来袭.由于该系统还在试用阶段,所以只有一套系统,因此有可能不能拦截所 有的导弹. 怎么办呢?多搞几套系统呗!你说说倒蛮容易,成本呢?成本是个大问题啊.所以俺就到这里来求救 了,请帮助计算一下最少需要多少套拦截系统.   这题白皮书上也有,他不是求最多拦截多少导弹(那样的话就是最长不下降子序列问题),而是求最少需要多少系统才能把导弹全部拦截下来,那么显然每一发导弹来临的时候我们都得把它拦截下来,如果一枚导弹来临的时候我们之前有一个系统拦截过的最后一个导弹把它高,那么就可以用这个系统来拦截它,吐过符合条件的有多个,显然用符合条件的系统里目前最低高度最小的那个拦截,因为其他最低高度比较高的还可以为拦截比当前导弹更高的导弹做准备。如果当前导弹很高,没有没有一个系统可以拦截下来,那就只能新开一个系统了。代码: 1 //贪心 2 #include<iostream> 3 #include<cstdio> 4 using namespace std; 5 const int maxn

luoguP1020 导弹拦截

限于喜欢 提交于 2019-12-03 14:45:46
题意 题目描述 某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统。但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能高于前一发的高度。某天,雷达捕捉到敌国的导弹来袭。由于该系统还在试用阶段,所以只有一套系统,因此有可能不能拦截所有的导弹。 输入导弹依次飞来的高度(雷达给出的高度数据是\le 50000≤50000的正整数),计算这套系统最多能拦截多少导弹,如果要拦截所有导弹最少要配备多少套这种导弹拦截系统。 输入格式 11行,若干个整数(个数\le 100000≤100000) 输出格式 22行,每行一个整数,第一个数字表示这套系统最多能拦截多少导弹,第二个数字表示如果要拦截所有导弹最少要配备多少套这种导弹拦截系统。 输入输出样例 输入 #1 389 207 155 300 299 170 158 65 输出 #1 6 2 说明/提示 为了让大家更好地测试n方算法,本题开启spj,n方100分,nlogn200分 每点两问,按问给分 分析 LIS的两种优化(好像不用这个做也行....但我不会呀) 问题1: 显然,是求最长不上升子序列 问题2: 分析一下, 问需要多少个系统才能把导弹全部拦截。 一个系统所能拦截的导弹是“不上升的”, 所以我们手算一下样例, 发现有转折的地方(“155”->“300”), 是必须要多加一个系统的。 而

最少拦截系统(贪心)

匿名 (未验证) 提交于 2019-12-03 00:29:01
某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统.但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能超过前一发的高度.某天,雷达捕捉到敌国的导弹来袭.由于该系统还在试用阶段,所以只有一套系统,因此有可能不能拦截所有的导弹. 怎么办呢?多搞几套系统呗!你说说倒蛮容易,成本呢?成本是个大问题啊.所以俺就到这里来求救了,请帮助计算一下最少需要多少套拦截系统. Input 输入若干组数据.每组数据包括:导弹总个数(正整数),导弹依此飞来的高度(雷达给出的高度数据是不大于30000的正整数,用空格分隔) Output 对应每组数据输出拦截所有导弹最少要配备多少套这种导弹拦截系统. Sample Input 8 389 207 155 300 299 170 158 65 Sample Output 2 题目大意就是每次读入一个导弹高度,先判断是否有炮可以拦截,如果没有就要再加一个拦截系统,如果可以拦截,就要选择一个拦截系统当前高度和目标导弹高度相差值最小的。这样才能使高度损失达到最低.换句话说,现在有3个拦截系统,目前的最高高度分别是100,90, 80,现在要拦截一个85的炮弹那么只能在100和90选一个,因为90和85相差比较近,高度损失小,所以选择90的这个拦截系统进行拦截. 用贪心写很简单,也可以用dp求 连续非递减最长子序列