这题还是有点意思的,有个数据可以试试:
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 ", cnt); } return 0; }