Two Merged Sequences 贪心
Posted xlbfxx
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Two Merged Sequences 贪心相关的知识,希望对你有一定的参考价值。
题目链接:http://codeforces.com/problemset/problem/1144/G
这个题和另外一个题非常相似,但是另外一个题比这个简单许多,有兴趣可以一起做一做。有题目和思路:https://www.cnblogs.com/xlbfxx/p/11255419.html
题意:将一个序列按顺序分为两个序列,一个严格递增,一个严格递减。空序列或者一个元素的序列可以作为递增或递减。
思路:
设置两个序列,一个递增,一个递减,遍历输入的序列,这个数和序列末尾的数比较
1.如果这个数只能放入递增序列,就放入递增序列。
2.如果这个数只能放入递减序列,就放入递减序列。
3.如果这个数能放入两个序列,就将这个数和它后面的数比较。
(1)如果大于后面的数,就放入递减序列。
(2)如果小于后面的数,就放入递增序列。
(3)如果相等,就分别放入两个序列。
为什么这样是对的呢?当这个数能放入两个序列时,它小于后面的数,如果后面的数是递增序列的,那这个数有没有都无所谓的,如果这个数放入递减序列,后面有可能又大于它的数想放入递减序列,但受到了这个数的限制,比如5 3 8 4,对于3这个数,它可以放入两个序列,它小于8,如果它放入递减序列,就限制了后面的4。
在我做这个题的时候,想错了一种情况,就是当序列就1个数的时候,我觉得它没办法分成两个序列,其实可以分成两个序列,一个序列一个数字,一个序列为空,都可以是递增或者递减。
AC代码:
#include<iostream> using namespace std; const int MAX=2e5+10; int a[MAX],b[MAX]; int main() int n; cin>>n; for(int i=0;i<n;i++)cin>>a[i]; int pre1=-1,pre2=MAX; //pre1是递增序列最后一个值,pre2是递减序列最后一个值 for(int i=0;i<n;i++) if(a[i]>pre1&&a[i]<pre2) if(i==n-1) b[i]=0; else if(a[i]<a[i+1]) b[i]=0; pre1=a[i]; else if(a[i]>a[i+1]) b[i]=1; pre2=a[i]; else b[i]=0; b[i+1]=1; pre1=a[i]; pre2=a[i]; i++; else if(a[i]>pre1) pre1=a[i]; b[i]=0; else if(a[i]<pre2) pre2=a[i]; b[i]=1; else cout<<"NO"<<endl; return 0; cout<<"YES"<<endl; for(int i=0;i<n;i++)cout<<b[i]<<" "; return 0;
以上是关于Two Merged Sequences 贪心的主要内容,如果未能解决你的问题,请参考以下文章
Codeforces #550 (Div3) - G.Two Merged Sequences(dp / 贪心)
G - Two Merged Sequences(dp&贪心)
G - Two Merged Sequences(dp&贪心)