HDU 1257 最少拦截系统 在dp里划水的贪心

中文题目:

某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统.但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能超过前一发的高度.某天,雷达捕捉到敌国的导弹来袭.由于该系统还在试用阶段,所以只有一套系统,因此有可能不能拦截所有的导弹.怎么办呢?多搞几套系统呗!你说说倒蛮容易,成本呢?成本是个大问题啊.所以俺就到这里来求救了,请帮助计算一下最少需要多少套拦截系统.
不知道怎么总结题意~~~上原题~ —^_^

分析案例:

8 389 207 155 300 299 170 158 65
第一发导弹 389 第一个拦截系统高度 389
第二发导弹 207 389 > 209 第一个系统可拦截 更新第一个拦截系统高度 209
第三发导弹 155 209 > 155 第一个系统可拦截 更新第一个拦截系统高度 155
第四发导弹 300 300 > 209 第一个系统不可拦截 添加第二个拦截系统高度300
第五发导弹 299 299 > 155 第一个系统不可拦截 300 > 299 第二个系统可拦截 更新第二个拦截系统高度 299
第六发导弹 170 170 > 155 第一个系统不可拦截 299 > 170 第二个系统可拦截 更新第二个拦截系统高度 170
第七发导弹 158 158 > 155 第一个系统不可拦截 170 > 158 第二个系统可拦截 更新第二个拦截系统高度 158
第八发导弹 65 155 > 65 第一个系统不可拦截 更新第一个拦截系统高度 65
拦截完毕!!!! 我都不认识拦截两个字了
又感觉像是模拟。。。。。。。

思路:

维护一个拦截系统的数组dp[maxn],cnt表示当前拦截系统个数,dp[i]表示该拦截系统可拦截的最大高度,i表示第i个拦截系统;每遍历一个导弹,查看当前所有拦截系统是否可拦截,一旦可拦截更新当前系统的值为当前导弹高度,若所有系统都不可拦截即创建新系统,让cnt++;

代码

#include <iostream>
#define maxn 100005
using namespace std;
int num[maxn];
int dp[maxn];
int main()
{
    std::ios::sync_with_stdio(false);
    int n;
    while(cin>>n){
        for(int i = 1; i <= n ;i++){
            cin>>num[i];
        }
        int cnt = 1;
        dp[1] = num[1];
        for(int i = 2; i <= n ;i++){
            bool flag = true;
            for(int j = 1; j <= cnt; j++){
                if(num[i] < dp[j]){
                    dp[j] = num[i];
                    flag = false;
                    break;
                }
            }
            if(flag){
                cnt++;
                dp[cnt] = num[i];
            }
        }
        cout<<cnt<<endl;
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/shensiback/article/details/80100639