hdu1257: 最少拦截系统

hdu1257: http://acm.hdu.edu.cn/showproblem.php?pid=1257
题意:导弹拦截系统:第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能超过前一发的高度,v[i]为依次发来的导弹高度,求最少需要多少套拦截系统 解法:贪心法:如对于样例,首先启动第一套,拦截前三个导弹后,限定值为155,再启动第二套,限定值为300,对于后面的导弹,采用贪心法,与前面的限定值作比较,采用限定值最接近该高度且小于该限定值的系统,如果没有这种系统,则另启动新系统。
code:
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<algorithm>
using namespace std;
int v[1000],ans[1000];
bool cmp(int a,int b)
{
    return a<b;
}
int main()
{
    int n,k,kk,cout;
    while(scanf("%d",&n)!=EOF)
    {
        for(int i=0;i<n;i++)
            scanf("%d",&v[i]);
        k=n-1;
        for(int i=0;i<n-1;i++)
            if(v[i+1]>v[i])     //求出最长子序列的始点
            {
                k=i;
                break;
            }
        cout=0;
        ans[cout++]=v[k];
        for(int i=k+1;i<n;i++)
        {
            sort(ans,ans+cout,cmp);      //可能数据比较少,每次都排序也没有超时,较优解法类似“嵌套娃娃”
            kk=cout;
            for(int j=0;j<cout;j++)
            {
                if(v[i]<=ans[j])      //找出最接近的限定值
                {
                    kk=j;
                    break;
                }
            }
            if(kk==cout)
                ans[cout++]=v[i];
            else
                ans[kk]=v[i];
        }
        printf("%d\n",cout);
    }
}
/*input:
8 389 207 155 300 299 170 158 65
output:
2*/

posted on 2012-07-25 17:53  acmer-jun  阅读(187)  评论(0编辑  收藏  举报

导航