给出一个序列 可以从最左或者最右取数 要求取得数呈递增
求出最多取多少个数 并输出操作
贪心即可
遇到一大一小显然取小的
当左右等值的时候 显然选择一方就不能再选另一方了
然后只能选择一方无脑往中间怼即可 比较一下即可
#include<bits/stdc++.h> using namespace std; //input by bxd #define rep(i,a,b) for(int i=(a);i<=(b);i++) #define repp(i,a,b) for(int i=(a);i>=(b);--i) #define RI(n) scanf("%d",&(n)) #define RII(n,m) scanf("%d%d",&n,&m) #define RIII(n,m,k) scanf("%d%d%d",&n,&m,&k) #define RS(s) scanf("%s",s); #define ll long long #define pb push_back #define CLR(A,v) memset(A,v,sizeof A) ////////////////////////////////// #define inf 0x3f3f3f3f const int N=(int)2e6+5; string ans; int n,a[N]; int main() { RI(n);rep(i,1,n)RI(a[i]); int L=1,R=n; int now=0; while(L<=R) { if(a[L]<a[R]&&now<a[R]) { if(a[L]>now) ans+='L',now=a[L],L++; else if(now<a[R]) ans+='R',now=a[R],R--; } else if(a[L]>a[R]&&now<a[L]) { if(now<a[R]) ans+='R',now=a[R],R--; else if(now<a[L]) ans+='L',now=a[L],L++; } else if(a[L]==a[R]&&a[L]>now) { int l=0,r=0; while( L+l+1<=n&&a[L+l]<a[L+l+1] )l++; while( R-r-1>=1&&a[R-r-1]>a[R-r] )r++; l++,r++; if(l<r) while(r--)ans+='R'; else while(l--)ans+='L'; break; } else break; } cout<<ans.size()<<endl<<ans; return 0; }