蓝桥杯-导弹拦截-贪心

2023-12-03 03:18
文章标签 拦截 贪心 蓝桥 导弹

本文主要是介绍蓝桥杯-导弹拦截-贪心,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

蓝桥杯-导弹拦截-贪心-dp-java

算法训练 拦截导弹  
时间限制:1.0s   内存限制:256.0MB

   

问题描述
某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统。但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能高于前一发的高度。某天,雷达捕捉到敌国的导弹来袭。由于该系统还在试用阶段,所以只有一套系统,因此有可能不能拦截所有的导弹。

  输入导弹依次飞来的高度(雷达给出的高度数据是不大于30000的正整数),计算这套系统最多能拦截多少导弹,如果要拦截所有导弹最少要配备多少套这种导弹拦截系统。
输入格式
一行,为导弹依次飞来的高度
输出格式
两行,分别是最多能拦截的导弹数与要拦截所有导弹最少要配备的系统数
样例输入
389 207 155 300 299 170 158 65
样例输出
6
2

解题思路: 这题的本质就是最长下降子序列

                   下降上升都一样 这个不是重点

                    求解此类问题 有两种方式

                   1.dp n*n 时间复杂度

                            1–n 第i个位置的最长子序列 = max(1— i-1)+1

                  2.二分查找 n*logn时间复杂度

                           建立一个空数组 每次放在数组的数都和最后一个数进行比较 符合要求就放入数组的末尾

                           不符合要求 就进入此时的数组进行二分查找 那么找啥呢? 看要求  比如本题求的是最长下降子序列 那么就找

                           比他大的第一个数的位置+1 的位置 然后将此位置的值 换成他 就可以了 如果不明白 可以自己找点数 模拟一遍就很好懂

                           注意:我写此题的时候用的是第二种 但这是不对的 这种方法只能求序列第一遍的最大子序列的长度 注意是长度

                                      所以这个不能这么用

              下面是ac代码 有一部分注释



import java.util.ArrayList;
import java.util.Scanner;

public class Main{

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Scanner scanner = new Scanner(System.in);
        while (scanner.hasNext()) {
            String [] str = scanner.nextLine().split(” “);
            int [] arr = new int [str.length];
            for (int i = 0; i < arr.length; i++) {
                arr[i] = Integer.parseInt(str[i]);
            }
            boolean [] flag = new boolean [arr.length];//记录已经被拦截的导弹
            int max = 0;//最大下降子序列的长度
            int num = 0;//需要几套导弹系统
            int sum = 0;//记录导弹拦截总数 用于跳出while循环
            while (sum != arr.length) { //当所有导弹被拦截 就结束循环
                ArrayList [] lists = new ArrayList [arr.length];
                for (int i = 0; i < lists.length; i++) {
                    lists[i] = new ArrayList<Integer>();
                }//记录每个子序列
                int index = 0; //最大子序列的下标
                int childMax = 0; //最大子序列的长度
                int k = 0;
                for (int i = 0; i < arr.length; i++) {
                    if (flag[i]) {
                        continue;
                    }
                    if (k == 0) {
                        k ++;
                        lists[i].add(i);
                        childMax = 1;
                        index = i;
                    }else {
                        int maxLength = -1;
                        int maxIndex = -1;
                        for (int j = i-1; j >= 0; j–) {
                            if (flag[j]) {
                                continue;
                            }
                            if (arr[i] < arr[j]) {
                                maxLength = maxLength > lists[j].size() ? maxLength : lists[j].size();
                                maxIndex = maxLength > lists[j].size() ? maxIndex : j;
                            }
                        }
                        if (maxIndex == -1) {
                            lists[i].add(i);
                        }else {
                            for (int j = 0; j < lists[maxIndex].size(); j++) {
                                lists[i].add(lists[maxIndex].get(j));
                            }
                            lists[i].add(i);
                        }
                        childMax = childMax > lists[i].size() ? childMax : lists[i].size();
                        index = childMax > lists[i].size() ? index : i;
                    }
                }
                for (int i = 0; i < lists[index].size(); i++) {
                    flag[(int) lists[index].get(i)] = true;
                }
                max = max > childMax ? max : childMax;
                num ++;
                sum += childMax;
            }
            System.out.println(max + “\n” + num);
        }
    }

}



http://www.ngui.cc/el/4466272.html

相关文章

分拆素数和 (hdu 2098)

分拆素数和 Problem Description 把一个偶数拆成两个不同素数的和&#xff0c;有几种拆法呢&#xff1f; Input 输入包含一些正的偶数&#xff0c;其值不会超过10000&#xff0c;个数不会超过500&#xff0c;若遇0&#xff0c;则结束。 Output 对应每个偶数&#xff0c;输出…

动态规划---子串查询 (前缀和的应用)

字符串中最小字母出现的次数 度度熊的字符串课堂开始了&#xff01;要以像度度熊一样的天才为目标&#xff0c;努力奋斗哦&#xff01; 为了检验你是否具备不听课的资质&#xff0c;度度熊准备了一个只包含大写英文字母的字符串 A[1,n]a1a2⋯anA[1,n]a1a2⋯an&#xff0c;接下…

超级台阶(递推)

超级台阶 描述 有一楼梯共m级&#xff0c;刚开始时你在第一级&#xff0c;若每次只能跨上一级或二级&#xff0c;要走上第m级&#xff0c;共有多少走法&#xff1f; 注&#xff1a;规定从一级到一级有0种走法。 输入 输入数据首先包含一个整数n(1<n<100)&#xff0c;表…

确定比赛次序(topesort)

确定比赛次序 有N个比赛队&#xff08;1<N<500&#xff09;&#xff0c;编号依次为1&#xff0c;2&#xff0c;3&#xff0c;。。。。&#xff0c;N进行比赛&#xff0c;比赛结束后&#xff0c;裁判委员会要将所有参赛队伍从前往后依次排名&#xff0c;但现在裁判委员会不…

还是畅通工程 (并查集+权值)

还是畅通工程 某省调查乡村交通状况&#xff0c;得到的统计表中列出了任意两村庄间的距离。省政府“畅通工程”的目标是使全省任何两个村庄间都可以实现公路交通&#xff08;但不一定有直接的公路相连&#xff0c;只要能间接通过公路可达即可&#xff09;&#xff0c;并要求铺设…

畅通工程再续 (hdu1875)

畅通工程再续 相信大家都听说一个“百岛湖”的地方吧&#xff0c;百岛湖的居民生活在不同的小岛中&#xff0c;当他们想去其他的小岛时都要通过划小船来实现。现在政府决定大力发展百岛湖&#xff0c;发展首先要解决的问题当然是交通问题&#xff0c;政府决定实现百岛湖的全畅通…

Let the Balloon Rise (map的应用)

Let the Balloon Rise Description 在ACM比赛中&#xff0c;你每解决一道题&#xff0c;你就可以获得一个气球&#xff0c;不同颜色的气球代表你解决了不同的问题。在WJL同学参加的一场ACM比赛中&#xff0c;他发现场面上有N个气球&#xff0c;并熟练的说出了气球的颜色。 请…

前m大的数 (普通方法+哈希算法)

前m大的数 还记得Gardon给小希布置的那个作业么&#xff1f;&#xff08;上次比赛的1005&#xff09;其实小希已经找回了原来的那张数表&#xff0c;现在她想确认一下她的答案是否正确&#xff0c;但是整个的答案是很庞大的表&#xff0c;小希只想让你把答案中最大的M个数告诉她…

Number Sequence (KMP)

Number Sequence Given two sequences of numbers : a[1], a[2], …… , a[N], and b[1], b[2], …… , b[M] (1 < M < 10000, 1 < N < 1000000). Your task is to find a number K which make a[K] b[1], a[K 1] b[2], …… , a[K M - 1] b[M]. If there are…

剪花布条 (KMP)

剪花布条 一块花布条&#xff0c;里面有些图案&#xff0c;另有一块直接可用的小饰条&#xff0c;里面也有一些图案。对于给定的花布条和小饰条&#xff0c;计算一下能从花布条中尽可能剪出几块小饰条来呢&#xff1f; Input 输入中含有一些数据&#xff0c;分别是成对出现的…

这篇关于蓝桥杯-导弹拦截-贪心的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/447886

相关文章

usaco 1.3 Barn Repair(贪心)

思路:用上M块木板时有 M-1 个间隙。目标是让总间隙最大。将相邻两个有牛的牛棚之间间隔的牛棚数排序,选取最大的M-1个作为间隙,其余地方用木板盖住。 做法: 1.若,板(M) 的数目大于或等于 牛棚中有牛的数目(C),则 目测 给每个牛牛发一个板就为最小的需求~ 2.否则,先对 牛牛们的门牌号排序,然后 用一个数组 blank[ ] 记录两门牌号之间的距离,然后 用数组 an

poj 3190 优先队列+贪心

题意: 有n头牛,分别给他们挤奶的时间。 然后每头牛挤奶的时候都要在一个stall里面,并且每个stall每次只能占用一头牛。 问最少需要多少个stall,并输出每头牛所在的stall。 e.g 样例: INPUT: 51 102 43 65 84 7 OUTPUT: 412324 HINT: Explanation of the s

poj 2976 分数规划二分贪心(部分对总体的贡献度) poj 3111

poj 2976: 题意: 在n场考试中,每场考试共有b题,答对的题目有a题。 允许去掉k场考试,求能达到的最高正确率是多少。 解析: 假设已知准确率为x,则每场考试对于准确率的贡献值为: a - b * x,将贡献值大的排序排在前面舍弃掉后k个。 然后二分x就行了。 代码: #include <iostream>#include <cstdio>#incl

POJ2010 贪心优先队列

c头牛,需要选n头(奇数);学校总共有f的资金, 每头牛分数score和学费cost,问合法招生方案中,中间分数(即排名第(n+1)/2)最高的是多少。 n头牛按照先score后cost从小到大排序; 枚举中间score的牛,  预处理左边与右边的最小花费和。 预处理直接优先队列贪心 public class Main {public static voi

ural 1820. Ural Steaks 贪心

1820. Ural Steaks Time limit: 0.5 second Memory limit: 64 MB After the personal contest, happy but hungry programmers dropped into the restaurant “Ural Steaks” and ordered  n specialty steaks

ural 1014. Product of Digits贪心

1014. Product of Digits Time limit: 1.0 second Memory limit: 64 MB Your task is to find the minimal positive integer number  Q so that the product of digits of  Q is exactly equal to  N. Inpu

每日一题|牛客竞赛|四舍五入|字符串+贪心+模拟

每日一题|四舍五入 四舍五入 心有猛虎,细嗅蔷薇。你好朋友,这里是锅巴的C\C++学习笔记,常言道,不积跬步无以至千里,希望有朝一日我们积累的滴水可以击穿顽石。 四舍五入 题目: 牛牛发明了一种新的四舍五入应用于整数,对个位四舍五入,规则如下 12345->12350 12399->12400 输入描述: 输入一个整数n(0<=n<=109 ) 输出描述: 输出一个整数

C语言蓝桥杯

一、语言基础 竞赛常用库函数 最值查询 min_element和max_element在vector(迭代器的使用) nth_element函数的使用 例题lanqiao OJ 497成绩分析 第一种用min_element和max_element函数的写法 第二种用min和max的写法 二分查找 二分查找只能对数组操作 binary_s

BUYING FEED(贪心+树状动态规划)

BUYING FEED 时间限制: 3000 ms  |  内存限制: 65535 KB 难度:4 描述 Farmer John needs to travel to town to pick up K (1 <= K <= 100)pounds of feed. Driving D miles with K pounds of feed in his truck costs D

vua 10700-Camel trading 贪心以及栈

大意:给一个表达式,可以让你任意套括号,问套完括号最大最小值是多少 贪心策略:最大的话,先+后*                  最小的话,先*后+ 用了一个栈堆模拟运算的次序 #include<stdio.h>#include<iostream>#include<stack>using namespace std;int main(){int N;scanf("%d",&