题意:
最少需要多少个拦截系统才能将所有的导弹拦截下来。
思路:
第1枚导弹一定需要第一个拦截系统,第2枚导弹如果比第1个高度高,则需要第二个拦截系统。
考虑第i枚导弹,如果前i-1枚导弹的高度都比它小,则需要新的一个拦截系统,否则一定只需要之前的某个拦截系统,不需要新开一个拦截系统。
原因是:假设最优方案中是为它新开了一个拦截系统,那么一定是之前的所有拦截系统都去拦截它后面的某些导弹去了,所以跳过了它。
而我们完全可以让之前的某个拦截系统去拦截它,而新开的拦截系统去拦截后面的导弹。
所以证明了:不需要新开一个拦截系统,只要之前所在比它高度大的导弹。
那么要让哪个拦截系统去拦截它呢?找到所有拦截系统中可以拦截它的并且最后一次拦截的高度是小的那个。这样是最优的。
开一个数组记录在最优的方案下每一个拦截系统最后一次拦截到的导弹高度。
看代码。
代码:
int n; int h[100005]; int d[100005]; int main(){ while(scanf("%d",&n)!=EOF){ rep(i,1,n) scanf("%d",&h[i]); d[1]=h[1]; int nc=1; rep(i,2,n){ if(h[i]>d[nc]){ d[++nc]=h[i]; }else{ int pos=lower_bound(d+1,d+1+nc,h[i])-d; d[pos]=h[i]; } } printf("%d ",nc); } return 0; }