版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/xiang_6/article/details/89738857
类似于C1,从两边先选小的,
如果一样大的话,那接下来选的只能是某一边连续的一段,
这样的话分别从两边开始选,最后看哪个结果最优
注意判断是否合法
#include <bits/stdc++.h>
#include <iostream>
using namespace std;
typedef long long ll;
const int maxn = 2e5 + 7;
int n;
int a[maxn];
int solve1(int l, int r, int x) {
if(a[l] <= x) return 0;
int res = 1;
int t = l+1;
while(t < r) {
if(a[t] > a[t-1]) res++;
else break;
t++;
}
return res;
}
int solve2(int l, int r, int x) {
if(a[r] <= x) return 0;
int res = 1;
int t = r-1;
while(t > l) {
if(a[t] > a[t+1]) res++;
else break;
t--;
}
return res;
}
int main() {
scanf("%d", &n);
for(int i = 1; i <= n; ++i) {
scanf("%d", &a[i]);
}
int l = 1, r = n;
vector<char> ans;
int t = 0;
while(l <= r) {
if(l == r) {
if(a[l] > t) ans.push_back('L');
break;
}
if(a[l] < a[r]) {
if(a[l] > t) {
ans.push_back('L');
t = a[l];
l++;
}
else if(a[r] > t){
ans.push_back('R');
t = a[r];
r--;
}
else break;
}
else if(a[l] > a[r]) {
if(a[r] > t) {
ans.push_back('R');
t = a[r];
r--;
}
else if(a[l] > t){
ans.push_back('L');
t = a[l];
l++;
}
else break;
}
else if(a[l] == a[r]) {
int t1 = solve1(l, r, t);
int t2 = solve2(l, r, t);
if(t1 >= t2) {
for(int j = 0; j < t1; ++j) {
ans.push_back('L');
}
break;
}
else {
for(int j = 0; j < t2; ++j) {
ans.push_back('R');
}
break;
}
}
}
cout << ans.size() << endl;
for(auto i : ans) {
printf("%c", i);
}
return 0;
}