HDU - 1257 —— 最少拦截系统 —— dp+贪心

2024-03-04 00:18

本文主要是介绍HDU - 1257 —— 最少拦截系统 —— dp+贪心,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!


某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统.但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能超过前一发的高度.某天,雷达捕捉到敌国的导弹来袭.由于该系统还在试用阶段,所以只有一套系统,因此有可能不能拦截所有的导弹. 
怎么办呢?多搞几套系统呗!你说说倒蛮容易,成本呢?成本是个大问题啊.所以俺就到这里来求救了,请帮助计算一下最少需要多少套拦截系统. 
Input
输入若干组数据.每组数据包括:导弹总个数(正整数),导弹依此飞来的高度(雷达给出的高度数据是不大于30000的正整数,用空格分隔) 
Output
对应每组数据输出拦截所有导弹最少要配备多少套这种导弹拦截系统. 
Sample Input
8 389 207 155 300 299 170 158 65
Sample Output
2


这道题其实刚开始想的复杂了,因为之前做过一道树状数组的题目。我就想用其中的算法,可以求得每一个导弹后面高度大于自己的导弹的数目。

是想出来以后,每次从前面的话会受后面导弹的影响,但是如果从那个后面处理的话,不能够及时对前面的导弹做出更新。所以我放弃了这种做法.

用dp的思路就是开始没有任何一条系统,直到发现当前系统最小的不能够大于新来的导弹高度时就ans ++;就相当于是增加了一条新的控制系统。

贪心体现在每次选择和当前所有的系统中最接近的系统匹配。

注:注释部分是刚开始的错误思路。。



#include <iostream>
#include <cstdio>
#include <string>
#include <cstring>
#include <cstdlib>
#include <queue>
#include <stack>
#include <map>
#include <vector>
#include <cmath>
#include <algorithm>using namespace std;#define MAX_N 100005
#define INF 0x3f3f3f3f
#define Mem(a,x) memset(a,x,sizeof(a))
#define ll long longint h[MAX_N],tree[MAX_N],m[MAX_N],dp[MAX_N];
bool vis[MAX_N];
//int lowbit(int x)
//{
//    return x&(-x);
//}
//void che(int p,int r)
//{
//    for(int i = p; i<=MAX_N; i+=lowbit(i))
//    {
//        tree[i] += r;
//    }
//}
//int sum(int x)
//{
//    int con = 0;
//    for(int i = x; i>=1; i-=lowbit(i))
//    {
//        con += tree[i];
//    }
//    return con;
//}
int main()
{int n;while(~scanf("%d",&n) && n){
//        Mem(vis,false);
//        Mem(tree,0);//dp[0] = INF;int ans = 0,g;for(int i = 0; i<n; i++){scanf("%d",&g);if(ans == 0) dp[ans] = g;int mint = INF,cur;bool flag = false;for(int j = 0; j<ans; j++) {if(g < dp[j] && mint > dp[j]-g) {mint = dp[j] - g;flag = true;cur = j;}}if(flag) {dp[cur] = g;}else {dp[ans] = g;ans ++;}}printf("%d\n",ans);
//        for(int i = n-1; i>=0; i--)
//        {
//            che(h[i],1);
//            int ans = 0;
//            ans = n-i-1-sum(h[i]-1);
//            m[i] = ans; // 记录每个导弹后面比它自己还要高的导弹的个数
//        }cout<<endl;for(int i = 0; i<n; i++) cout<<m[i]<<' ';cout<<endl;
//        int getc = 0,ans = 0;
//        for(int i = 0; i<n; i++)
//        {
//            if(vis[i]) continue;
//            vis[i] = true;
//            int f = 1,cur = 0;
//            for(int j = n-1; j>i; j--)
//            {
//                if(!vis[h[j]] && f)
//                {
//                    vis[h[j]] = true;
//                    f = 0;
//                    cur = m[j];
//                }
//                if(m[j] >= cur && !vis[h[j]]) {
//                    vis[h[j]] = true;
//                    cur = m[j];
//                }
//            }
//            ans ++;
//            if(f) break;
//        }
//        cout<<ans<<endl;//        while(true) {
//            Mem(dp,0);
//            for(int i = 0; i<n; i++) {
//                dp[i] = 1;
//                for(int j = 0; j<i; j++) {
//                    if(h[i] < h[j]) {
//                        dp[i] = max(dp[i],dp[j]+1);
//                    }
//                }
//            }
//        }}return 0;
}



这篇关于HDU - 1257 —— 最少拦截系统 —— dp+贪心的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

什么是cron? Linux系统下Cron定时任务使用指南

《什么是cron?Linux系统下Cron定时任务使用指南》在日常的Linux系统管理和维护中,定时执行任务是非常常见的需求,你可能需要每天执行备份任务、清理系统日志或运行特定的脚本,而不想每天... 在管理 linux 服务器的过程中,总有一些任务需要我们定期或重复执行。就比如备份任务,通常会选在服务器资

TP-LINK/水星和hasivo交换机怎么选? 三款网管交换机系统功能对比

《TP-LINK/水星和hasivo交换机怎么选?三款网管交换机系统功能对比》今天选了三款都是”8+1″的2.5G网管交换机,分别是TP-LINK水星和hasivo交换机,该怎么选呢?这些交换机功... TP-LINK、水星和hasivo这三台交换机都是”8+1″的2.5G网管交换机,我手里的China编程has

基于Qt实现系统主题感知功能

《基于Qt实现系统主题感知功能》在现代桌面应用程序开发中,系统主题感知是一项重要的功能,它使得应用程序能够根据用户的系统主题设置(如深色模式或浅色模式)自动调整其外观,Qt作为一个跨平台的C++图形用... 目录【正文开始】一、使用效果二、系统主题感知助手类(SystemThemeHelper)三、实现细节

CentOS系统使用yum命令报错问题及解决

《CentOS系统使用yum命令报错问题及解决》文章主要讲述了在CentOS系统中使用yum命令时遇到的错误,并提供了个人解决方法,希望对大家有所帮助,并鼓励大家支持脚本之家... 目录Centos系统使用yum命令报错找到文件替换源文件为总结CentOS系统使用yum命令报错http://www.cppc

不懂推荐算法也能设计推荐系统

本文以商业化应用推荐为例,告诉我们不懂推荐算法的产品,也能从产品侧出发, 设计出一款不错的推荐系统。 相信很多新手产品,看到算法二字,多是懵圈的。 什么排序算法、最短路径等都是相对传统的算法(注:传统是指科班出身的产品都会接触过)。但对于推荐算法,多数产品对着网上搜到的资源,都会无从下手。特别当某些推荐算法 和 “AI”扯上关系后,更是加大了理解的难度。 但,不了解推荐算法,就无法做推荐系

基于人工智能的图像分类系统

目录 引言项目背景环境准备 硬件要求软件安装与配置系统设计 系统架构关键技术代码示例 数据预处理模型训练模型预测应用场景结论 1. 引言 图像分类是计算机视觉中的一个重要任务,目标是自动识别图像中的对象类别。通过卷积神经网络(CNN)等深度学习技术,我们可以构建高效的图像分类系统,广泛应用于自动驾驶、医疗影像诊断、监控分析等领域。本文将介绍如何构建一个基于人工智能的图像分类系统,包括环境

水位雨量在线监测系统概述及应用介绍

在当今社会,随着科技的飞速发展,各种智能监测系统已成为保障公共安全、促进资源管理和环境保护的重要工具。其中,水位雨量在线监测系统作为自然灾害预警、水资源管理及水利工程运行的关键技术,其重要性不言而喻。 一、水位雨量在线监测系统的基本原理 水位雨量在线监测系统主要由数据采集单元、数据传输网络、数据处理中心及用户终端四大部分构成,形成了一个完整的闭环系统。 数据采集单元:这是系统的“眼睛”,

hdu4826(三维DP)

这是一个百度之星的资格赛第四题 题目链接:http://acm.hdu.edu.cn/contests/contest_showproblem.php?pid=1004&cid=500 题意:从左上角的点到右上角的点,每个点只能走一遍,走的方向有三个:向上,向下,向右,求最大值。 咋一看像搜索题,先暴搜,TLE,然后剪枝,还是TLE.然后我就改方法,用DP来做,这题和普通dp相比,多个个向上

hdu1011(背包树形DP)

没有完全理解这题, m个人,攻打一个map,map的入口是1,在攻打某个结点之前要先攻打其他一个结点 dp[i][j]表示m个人攻打以第i个结点为根节点的子树得到的最优解 状态转移dp[i][ j ] = max(dp[i][j], dp[i][k]+dp[t][j-k]),其中t是i结点的子节点 代码如下: #include<iostream>#include<algorithm

嵌入式QT开发:构建高效智能的嵌入式系统

摘要: 本文深入探讨了嵌入式 QT 相关的各个方面。从 QT 框架的基础架构和核心概念出发,详细阐述了其在嵌入式环境中的优势与特点。文中分析了嵌入式 QT 的开发环境搭建过程,包括交叉编译工具链的配置等关键步骤。进一步探讨了嵌入式 QT 的界面设计与开发,涵盖了从基本控件的使用到复杂界面布局的构建。同时也深入研究了信号与槽机制在嵌入式系统中的应用,以及嵌入式 QT 与硬件设备的交互,包括输入输出设