比赛 假期找点事儿做题吧 评测结果 AAAAAAAAAA
题目名称 渡轮问题 最终得分 100
用户昵称 Hyoi_0Koto 运行时间 0.193 s
代码语言 C++ 内存使用 0.13 MiB
提交时间 2017-06-09 19:23:47
显示代码纯文本
#include<iostream>
#include<cstdio>
#include<cctype>
using namespace std;
inline void in(int &x){
    x=0;int f=1;char t=getchar();
    while(!isdigit(t)){if(t=='-')f=-1;t=getchar();}
    while(isdigit(t)){x=x*10+t-48;t=getchar();}
    x*=f;
}
const int maxn=30003;
int n,ans=0;
int a[maxn],f[maxn];
int flag,b[maxn],cnt;
inline void dp(){
	fill(f,f+n+1,1);
	for(int i=2;i<=n;i++)
	 for(int j=1;j<i;j++){
	 	if(a[j]<=a[i]){
	 	f[i]=max(f[i],f[j]+1);	
		}
	 	ans=max(ans,f[i]);
	}
	for(int i=1;i<=n;i++){
		if(f[i]==ans){
			flag=i;
			b[ans]=a[i];
			break;
		}
	}
	cnt=ans;
	while(cnt){
		for(int i=1;i<=flag;i++){
			if((f[i]==cnt-1)&&(a[i]<=b[cnt])){
				b[cnt-1]=a[i];
				break;
			}
		}
		cnt--;
	}
	printf("%d\n",ans);
	for(int i=1;i<=ans;i++) printf("%d ",b[i]);
}
inline void work(){
	in(n);
	for(int i=1;i<=n;i++) in(a[i]);
	dp();
}
inline int mian(){
	freopen("maxxl.in", "r", stdin);
    freopen("maxxl.out", "w", stdout);
    work();
}
int miku=mian();
int main(){;}