zoukankan      html  css  js  c++  java
  • 洛谷【P3903 导弹拦截III】 题解

    题目描述

    很多年以前,A 国发明了一种导弹系统用来拦截敌对势力发射的导弹。

    这个系统可以发射一颗导弹拦截从由到远、高度不增加的多个导弹。

    但是现在,科学家们发现这个防御系统还不够强大,所以他们发明了另外一套导弹系统。

    这个新系统可以发射一颗导弹由近到远的拦截更多的导弹。

    当这个系统启动,首先选择一颗敌人的导弹进行拦截,然后拦截一颗更远的高度更低的导弹进行拦截,然后拦截比第二颗更远的但高度更高的导弹……以此类推,拦截的第奇数颗导弹比前一颗导弹更远、更高,拦截的第偶数颗导弹比前一个更远、更低。

    现在,给你一个从近到远的导弹高度列表,计算新系统发射一颗导弹可以拦截的最多的导弹数目。

    输入格式

    第一行是一个整数 nn,表示敌人发射的导弹数目。接下来的一行有 nn 个整数,表示由近到远的。

    输出格式

    仅一个整数,表示拦截的最多导弹的数量。

    题解

    根据题意,拦截的第n(n为偶数)颗导弹要小于拦截的第n-1、n+1颗导弹。

    我们先不管拦截的策略,先从前两颗导弹开始考虑: 假设第一颗导弹就是我们想拦截的第一颗导弹。如果第二颗导弹比第一颗导弹高,那么就令第二颗导弹为想拦截的第一颗导弹。因为对于奇数颗导弹,高度越高,下一颗导弹的选择就越多,能拦截的导弹数也就可能越多。 举个例子,如果: n=5 导弹高度为4 6 5 6 3 如果选择第一颗导弹4为拦截的第一颗导弹,那么拦截的第二颗导弹只能为3,但如果选择第二颗导弹6为拦截的第一颗导弹,那么第二颗导弹就可以选择5和3了,多了一个5作为选择,那么可以拦截的导弹数就可能增多(事实上确实增多了)。 如果第二颗导弹比第一颗导弹低,那么就令第二颗导弹为想拦截的第二颗导弹。这个没什么好解释的。

    同样的,对于拦截的第n颗(n为偶数)导弹,如果其下一颗导弹比该导弹低,那么就选择其下一颗导弹代替该导弹为拦截的第n颗导弹;如果比该导弹高,就令下一颗导弹为拦截的第n+1颗导弹。

    AC代码如下:

    #include<bits/stdc++.h>
    using namespace std;
    int a[1001],b[1001];
    int main(){
        int t=1,i,n;
        cin>>n;
        for(i=1;i<=n;i++)  cin>>a[i];
        b[1]=a[1];
        for(i=2;i<=n;i++)
        {
        if(t%2!=0&&a[i]>a[i-1])  b[t]=a[i]; 
        if(t%2!=0&&a[i]<a[i-1])  b[++t]=a[i];   
        if(t%2==0&&a[i]<a[i-1])  b[t]=a[i]; 
        if(t%2==0&&a[i]>a[i-1])  b[++t]=a[i];   
        }
        cout<<t;
    }

    贪心的核心就是这4个if判断语句。t是拦截的导弹数。b[i]是拦截的第i颗导弹的高度。

  • 相关阅读:
    城市的划入划出效果
    文本溢出省略解决笔记css
    长串英文数字强制折行解决办法css
    Poj 2352 Star
    树状数组(Binary Indexed Trees,二分索引树)
    二叉树的层次遍历
    Uva 107 The Cat in the Hat
    Uva 10336 Rank the Languages
    Uva 536 Tree Recovery
    Uva10701 Pre, in and post
  • 原文地址:https://www.cnblogs.com/lau1997/p/12498036.html
Copyright © 2011-2022 走看看