最少拦截系统

hdoj 1257

解决:贪心 首先按照 每颗导弹到来时的高度排序,若要配备最少的导弹拦截系统,一定是希望一个拦截系统装置可以拦截尽可能多的导弹,但是这些导弹必须满足先后顺序,后来的而且导弹高度低于前一个的可以共用一个系统,这样有多少满足条件的数字序列就是需要多少个导弹拦截系统装置。

#include <iostream>
#include <algorithm>
#include <bitset>
using namespace std;
int n;
struct node
{
    int id;
    int high;
};
node missile[100000];
bool operator < (const node &a,const node &b)
{
    return a.high>b.high;
}

void greedySelect()
{
    sort(missile,missile+n);
    bitset<100000> b;
    b.reset();
    int cnt=0,i,j,t;
   while(1)
   {
        for(i=0;i<n;i++)
         if(b[missile[i].id]==0)
         {
             t=i; 
             break; 
         }
        if(i==n)break;
        b[missile[t].id]=1;
        for(j=1;j<n;j++)
        {
            if(b[missile[j].id]==0 && missile[j].id > missile[t].id && missile[j].high < missile[t].high)
            {
                t=j;
                b[missile[j].id]=1;
            }
        }
        cnt++;
    }
    printf("%d\n",cnt);
}
int main()
{
    while(scanf("%d",&n)!=EOF)
    {
        for(int i=0;i<n;i++)
        {
            missile[i].id=i;
            scanf("%d",&missile[i].high);
        }
        greedySelect();
    }
    system("pause");
    return 0;
}

原文地址:https://www.cnblogs.com/hpustudent/p/2189597.html