HDU 1257 最少拦截系统

这题还是有点意思的,有个数据可以试试:

8 7 6 5 6 3 2 4 1。答案是2而非3。问题就在于:拦截系统用完并非消失,以后有可以用的时候还是可以用的。

那么对于每个导弹,贪心地用被利用得已经高度最低的拦截系统去处理它,如果没有能处理的时候就增加个拦截系统。知道思路之后自己写就行了。

#include <iostream>
#include <bits/stdc++.h>
using namespace std;

#define ll long long
#define mst(a,b) memset(a,b,sizeof(a))
#define rep(i,a,b) for(ll i=(a);i<(b);++i)
#define scf(n) scanf("%d", &(n));
const int inf = 0x3f3f3f3f, maxN = 1e4 + 5;
int N, M, T;
int dd[maxN];
int xt[maxN];

int main() {
#ifndef ONLINE_JUDGE
    freopen("data.in", "r", stdin);
#endif
    while (~scanf("%d", &N) && N) {
        rep(i, 0, N) scf(dd[i]);
        mst(xt, -inf);

        int cnt = 0;
        rep(i, 0, N) {
            int minIdx = 0, minV = inf;
            int ok = 0;
            rep(j, 0, cnt) {
                if (xt[j] >= dd[i] && xt[j] < minV) {
                    minV = xt[j];
                    minIdx = j;
                }
            }
            if (minV != inf && minV >= dd[i])
                ok = 1;
            if (!ok)
                xt[cnt++] = dd[i];
            else
                xt[minIdx] = dd[i];
        }
        printf("%d\n", cnt);
    }
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/Rosebud/p/9158168.html