题目大意
给出一个序列,可以从左或从右侧取数,要求取出的序列严格上升
思路
贪心取左右最小的,如果相等则之后只能从一侧取,直接选能取最长的一侧
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;
}
}
原文地址:https://www.cnblogs.com/xxrlz/p/10777436.html
时间: 2024-10-18 20:11:08