8 389 207 155 300 299 170 158 65
#include<stdio.h> #include<string.h> #include<algorithm> using namespace std; int a[10001],h[10001]; int main(){ int n,i,j,sum; while(~scanf("%d",&n)){ memset(a,0,sizeof(a)); memset(h,0,sizeof(h)); for(i=1;i<=n;i++) scanf("%d",&h[i]); int max=-1; a[1]=1; for(i=2;i<=n;i++){ max=-1; for(j=1;j<i;j++){ if(h[i]<=h[j]){ if(max<a[j]+1) max=a[j]+1; } } a[i]=max; } //找出a[1]~a[n]中的最大值即可; sort(a+1,a+1+n); printf("%d\n",a[n]); int sys[10001]={0}; int tail=1,minheight,select; sys[1]=h[1]; //i代表的是第几个导弹; for(i=2;i<=n;i++){ minheight=99999999; for(j=1;j<=tail;j++){ //判断当前系统的高度是否大于来的导弹的高度; //下面那部分是为了选择一套最优的方案,即当情况都成立时,选择高度较低的那个系统; if(sys[j]>=h[i]) if(sys[j]<minheight){ minheight=sys[j]; select=j; } } //说明当前系统都无法满足,那么就要另外开启系统了, if(minheight==99999999){ tail++; sys[tail]=h[i]; } //否则的话更新该系统的高度值,因为打了一次之后高度就会比原来的低了; else sys[select]=h[i]; } printf("%d\n",tail); } }
原文地址:http://blog.csdn.net/acmer_hades/article/details/44242659