1257:最少拦截系统

来源:互联网 发布:淘宝发送优惠券给买家 编辑:程序博客网 时间:2024/06/05 03:49

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1257

方法:贪心

思路:这道题原来做的时候是照着葫芦画瓢用DP做的,现在基本都忘的差不多了,DP确实很难,现在还不太懂。今天刷贪心,发现这题用贪心会简单一些。目前有两种基本思路,一是从头到尾捋一遍,只要能拦截的都拦截掉,然后再重新捋一遍,直到所有导弹都被拦截掉,这种方法比较直观。二是每次导弹来的时候,在已有的导弹系统中选择一个拦截,选择的标准就是当前打击高度距离当前导弹高度最近的那个系统,因为如果选择高度差较远的系统,由于该系统打完这一枚导弹之后高度就限定在了该高度上,等于是说这中间的高度差都被浪费了,所以要尽可能选择高度差小的系统,如果所有系统都不能拦截,就只能重新开辟一套系统。鉴于系统是不定的,所以用vector是非常好的选择。

难点:本题是一道极为经典的题目,还要深入钻研,另外,用vector可以省很多事儿。

#include<iostream>#include<vector>using namespace std;int main(){    int n;    while(cin>>n)    {        int h;        vector<int> v;        cin>>h;        v.push_back(h);        n--;        while(n--)        {            int flag = 0;            int res = 0;            int minum = 0x7ffffff;            cin>>h;            for(int i = 0;i < v.size();i++)            {                if(h <= v[i]&&minum > v[i] - h)                {                    minum = v[i]-h;                    flag = 1;                    res = i;                }            }            if(flag == 1)            {                v[res] = h;            }            if(flag == 0)            {                v.push_back(h);            }        }        cout<<v.size()<<endl;    }}


0 0
原创粉丝点击