Codeforces Round #555 div3 C2

题目大意

给出一个序列,可以从左或从右侧取数,要求取出的序列严格上升

思路

贪心取左右最小的,如果相等则之后只能从一侧取,直接选能取最长的一侧

Code:

 #include<bits/stdc++.h> 

#define ll long long 

#define inf 0x3f3f3f3f
using namespace std; 

int ma[10];
int n;
int a[(int)(2*1e5)+10];

int main(){
	scanf("%d",&n);
	for(int i=1;i<=n;++i){
		scanf("%d",&a[i]);
	}
	int cmin = 0;
	int l = 1,r=n;
	vector<int> ans;
	while(l<=r && cmin<max(a[l],a[r])){
		if(a[l]==a[r]){
			if(r-l<3){
				ans.push_back(0);
				cmin = a[l++];
			}
			else{
				int cntl=0,cntr=0;
				int ind = l+1;
				while(a[ind]>a[ind-1]) cntl++,ind++;	//左边可取的长度
				ind = r-1;
				while(a[ind]>a[ind+1]) cntr++,ind--;	//右边可取的长度
				if(cntl>cntr){
					ans.push_back(0);
					cmin = a[l++];
				}else{
					ans.push_back(1);
					cmin = a[r--];
				}
			}
			continue;
		} 
		// cmin<a[l]<a[r] 或 a[r] < cmin < a[l]
		if((a[l]<a[r] && cmin<a[l] )|| cmin>=a[r]){
			ans.push_back(0);
			cmin = a[l++];
		}else{	// cmin < a[r] < a[l] 或 a[l] < cmin < a[r]
 			ans.push_back(1);
			cmin = a[r--];
		}
	}
	printf("%d\n",ans.size());
	for(int i:ans){
		if(i==0)printf("L");
		else printf("R");
	}
	printf("\n");
	return 0;
}
} 

posted @ 2019-04-27 01:34  新新人類  阅读(118)  评论(0编辑  收藏  举报