C2. Increasing Subsequence (hard version)(贪心)

C2. Increasing Subsequence (hard version)

 

思路:

分为4种情况,最难的就是(pre表示上一个进入队列的元素)a[i]>pre&&a[j]>pre&&a[i]==a[j]的情况,

可以分为两种情况,先选取a[i],然后向后遍历得到字符串s1,

或者选取a[j]先前遍历得到字符串s2,然后选取字符串较长的那个。

 

#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
using namespace std;
const int maxn = 3e5+10;
int que[maxn],a[maxn];
int main(void)
{
	int n,i,x;
	scanf("%d",&n);
	for(i=1;i<=n;i++) scanf("%d",&a[i]);
	string ss = "";
	int pre = 0,l = 1,r = n;
	while(l<r){
		if(a[l]>pre&&a[r]>pre){
			if(a[l]<a[r]){
				ss+="L";pre = a[l];l++;
			}
			else if(a[l]>a[r]){
				ss+="R";pre = a[r],r--;
			}
			else if(a[l]==a[r]){
				string tl,tr;
				int lpre = pre,left = l;
				while(left<r&&a[left]>lpre){
					tl+="L";
					lpre = a[left++];
				}
				int rpre = pre,right = r;
				while(right>l&&a[right]>rpre){
					tr+="R";
					rpre = a[right--];
				}
				if(tr.length()<tl.length()) ss+=tl,pre = lpre,l = left;
				else ss+=tr,pre = rpre,r = right;
			}
		}
		else if(a[l]>pre&&a[r]<=pre){
			ss+="L";pre = a[l];l++;
		}
		else if(a[r]>pre&&a[l]<=pre){
			ss+="R";pre = a[r];r--;
		}
		else break;
	}
	if(l==r&&pre<a[l]) ss+="R";
	cout<<ss.length()<<endl<<ss<<endl;
	return 0;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值