dp&贪心

拦截导弹

https://ac.nowcoder.com/acm/problem/16810

题解:
此题有两个问题,第一求这套系统最多能拦截多少导弹,第二个求如果要拦截所有导弹最少要配备多少套这种导弹拦截系统。

第一个问题即为求最长下降子序列,不多阐述。

对于第二个问题我是用贪心求解的。
对于每一个处在i位置的导弹,它可以和(从1到i-1位置且还没有被击落的)任一大于等于其高度的导弹共在一套装置(意思即为无需添置新的装置),在此想既然是选一个符合要求的导弹共处一套装置,则选对于之后的更有利的导弹(即为选比位置i导弹高度高的所有导弹中高度最小的那个,可以好好思考一下为何如此选)。

AC代码:

#include<iostream>
using namespace std;
const int Max = 1e5 + 5;
int lst[7], dp[7][2];//一个用来存放dp,一个用来存放贪心。至于为啥数组开这么小,因为发现这题数据是个伪1w,总共连10个导弹都没有,开个7就过了...
int g = 0;

int main()
{
    int t;
    while (cin >> t)
    {
        lst[++g] = t;
    }
    for (int i = 1; i <= g; i++)
    {
        dp[i][0] = 1;
        int f = i, f1 = 1e9 + 5;
        for (int j = 1; j < i; j++)
        {
            if (lst[i] <= lst[j]) dp[i][0] = max(dp[i][0], dp[j][0] + 1);
            if (dp[j][1] && lst[j] >= lst[i] && lst[j] < f1)
            {
                f = j;
                f1 = lst[j];
            }
        }
        dp[f][1] = 0;
        dp[i][1] = 1;
    }
    int ma = -9, sum = 0;
    for (int i = 1; i <= g; i++)
    {
        ma = max(dp[i][0], ma);
        sum += dp[i][1];
    }
    cout << ma << endl << sum;
}
全部评论

相关推荐

点赞 评论 收藏
分享
09-01 09:00
已编辑
四川旅游学院 运营
牛客55195891...:主要是专业不好,别的没毛病
牛客解忧铺
点赞 评论 收藏
分享
点赞 评论 收藏
分享
10-13 22:56
门头沟学院 C++
rt,鼠鼠的浪潮网签明天过期,鼠鼠是山东人,好像自己也能接受。之前的面试大厂基本挂干净了,剩下小米二面后在泡,问了下面试官没有挂,但要泡。还有海信似乎也通过了,不过在深圳,鼠鼠也不是很想去。其它还有一些公司应该陆陆续续还有一些面试,现在有些纠结是直接签了还是再等再面呢?大佬们能不能给鼠鼠提一些意见,万分感谢!!!
牛客78696106...:浪潮可不是开摆,当初我还是开发的时候我组长跟我说他们组有段时间天天1,2点走,早上5点就来,全组肝出来心肌炎,浪潮挣钱省立花可不是说说,当然也看部门,但是浪潮普遍就那dio样,而且你算下时薪就知道不高,没事也是9点半走,不然算你旷工
投递小米集团等公司10个岗位
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务