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;
}

猜你喜欢

转载自www.cnblogs.com/xlbfxx/p/11270050.html
今日推荐