Codeforces Round # 555 (Div. 3) C2. Increasing subsequence (complicated version) (贪心)
Posted xorxor
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Codeforces Round # 555 (Div. 3) C2. Increasing subsequence (complicated version) (贪心)相关的知识,希望对你有一定的参考价值。
题目链接:http://codeforces.com/contest/1157/problem/C2
当左右两边数字相同时,需要判断一下取哪边能得到更长的递增序列
#include <iostream> #include <cstring> #include <algorithm> #include <cmath> #include <cstdio> #include <queue> #include <climits> #include <set> #include <stack> #include <string> #include <map> #include <vector> #define INF 0x3f3f3f3f using namespace std; typedef long long ll; static const int MAX_N = 2e5 + 5; static const ll Mod = 2009; char str[MAX_N]; int a[MAX_N]; void solve() // freopen("input.txt", "r", stdin); // freopen("output.txt", "w", stdout); int n; while(scanf("%d", &n) != EOF) for(int i = 0; i < n; ++i) scanf("%d", &a[i]); int s = 0, e = n - 1, cnt = 0, prev = 0; //prev为序列中最大值 while(s <= e) if(a[s] <= prev) while(a[e] > prev && e >= s) prev = a[e--]; str[cnt++] = ‘R‘; break; if(a[e] <= prev) while(a[s] > prev && s <= e) prev = a[s++]; str[cnt++] = ‘L‘; break; if(a[s] < a[e] && a[s] > prev) prev = a[s++]; str[cnt++] = ‘L‘; continue; if(a[s] > a[e] && a[e] > prev) prev = a[e--]; str[cnt++] = ‘R‘; continue; int e1 = 0, e2 = 0; if(a[s] > prev) e1 = 1; while(s + e1 <= e && a[s + e1] > a[s + e1 - 1]) ++e1; if(a[e] > prev) e2 = 1; while(e - e2 >= s && a[e - e2] > a[e - e2 + 1]) ++e2; if(e1 > e2) prev = a[s++]; str[cnt++] = ‘L‘; else prev = a[e--]; str[cnt++] = ‘R‘; str[cnt] = ‘\0‘; printf("%d\n%s\n", cnt, str); int main() solve(); return 0;
以上是关于Codeforces Round # 555 (Div. 3) C2. Increasing subsequence (complicated version) (贪心)的主要内容,如果未能解决你的问题,请参考以下文章
E Minimum Array ( Codeforces Round #555 (Div. 3) )
Codeforces Round #555 (Div. 3)[1157]题解
codeforces 555b//Case of Fugitive// Codeforces Round #310(Div. 1)
Codeforces Round # 555 (Div. 3) C2. Increasing subsequence (complicated version) (贪心)