【题目分析】
构造一个队列(先进先出)进行模拟,因为要输出N,N-1,N-1,……,1,所以在每次加入元素时,只要比较已有的队列中的队尾元素,当队尾元素比加入的元素大时可以把加入的元素放在这个队列的队尾,否则新成立一个队列,时间复杂度O(n^2),十万的数据可定会超时,然而...此题数据略水,被我卡过了
#include<cstdio> #include<cstring> #include<iostream> using namespace std; int n; struct node{ int head,tail; }q[100010]; int cnt=0,x; int main() { freopen("manage.in","r",stdin); freopen("manage.out","w",stdout); scanf("%d",&n); for(int i=1;i<=n;i++) { scanf("%d",&x); int flag=0; for(int j=1;j<=cnt;j++) if(q[j].tail>x) { q[j].tail=x; flag=1; break; } if(flag==0) q[++cnt].tail=x; } printf("%d",cnt); fclose(stdin);fclose(stdout); return 0; }
正解据说是拦截导弹第二问
#include <cstdio> using namespace std; #define MAX 100000 #define INF 100000000 int a[MAX],c[MAX],len; int find(int L,int R,int x) { if (L == R) return L; int mid = (L+R)>>1; if (c[mid] < x) return find(mid+1,len,x); else return find(L,mid,x); } int main() { freopen("manage.in", "r", stdin); freopen("manage.out", "w", stdout); int i,n,t,m,T,b,k,ans,j,max; scanf("%d", &n); for(i = 0; i < n; i++) scanf("%d", &a[i]); len = 0; c[0] = -INF; for(i = 0; i < n; i++) { if (a[i] > c[len]) j = ++len; else j = find(1, len, a[i]); c[j] = a[i]; } printf("%d ",len); return 0; }