贪心

简介: AcWing 134. 双端队列

贪心

问题一:怎么使用双端队列排序?

我们需要把一段没有排序的数字输入到双端队列中并且排好序了,怎么操作呢

  1. 首先插入第一个数字
  2. 后续数字如果比队尾数字大,就从后边插入
  3. 如果比队头元素小,就从前面插入
  4. 除此之外,如果它即比队头大,又比队尾小,那么这个队列不能将他排序,需要在开一个队列

后面插入的下标都会更大,第一个数的下标为1

结论:用双端队列排好序后,里面数的下标呈现 单谷性质(先单调递减,后单调递增)


所以说:

第一:我们先将序列排好序,观察他们的坐标,他们的坐标呈现几个单谷,就需要几个双端队列

第二:排好序后, 值一样的数可以相互交换下标,这样并不影响这个有序的序列

问题转化为:我们如何操作,使谷峰最少?

先找到值一样的数里面,下标的最大最小值maxv,minv;

Whiteboard.png

基于以上贪心思路,可以使波谷出现次数最少。

if(st == -1)                                    //初始为下降状态
        {
            if(maxv < last) last = minv;        //第一种
            else 
            {
                st = 1;
                last = maxv;                    //第二种
            }
        }
        else
        {
            if(last < minv) last = maxv;        //第三种
            else
            {
                res ++ ;
                last = minv;                    //第四种
                st = -1;
            }
        }

AC

#include <iostream>
#include <cstring>
#include <algorithm>

using namespace std;
typedef pair<int, int> PII;
const int N = 2e5 + 10;

int n;
PII a[N];

int main()
{
    cin >> n;
    for(int i = 0; i < n; i ++ )
    {
        cin >> a[i].first;
        a[i].second = i;
    }
    sort(a, a + n);
    
    int res = 1;
    int last = n + 1;
    int st = -1;
    int i = 0;
    while(i < n)
    {
        int j = i;
        while(j < n && a[j].first == a[i].first) j ++ ;
        
        int minv = a[i].second;
        int maxv = a[j - 1].second;
        if(st == -1)
        {
            if(maxv < last) last = minv;
            else 
            {
                st = 1;
                last = maxv;
            }
        }
        else
        {
            if(last < minv) last = maxv;
            else
            {
                res ++ ;
                last = minv;
                st = -1;
            }
        }
        i = j;
    }
    cout << res << endl;
    return 0;
}
目录
相关文章
|
8月前
|
存储 算法 Java
贪心算法和动态规划
贪心算法和动态规划
97 0
|
3月前
|
人工智能 算法 安全
详解贪心算法
详解贪心算法
|
8月前
|
机器学习/深度学习 Kubernetes 算法
贪心算法 - 常见的问题总结(三)
贪心算法 - 常见的问题总结(三)
|
算法
【贪心算法】删数问题
【贪心算法】删数问题
84 0
|
机器学习/深度学习 算法 C++
简单的贪心
简单的贪心
69 0
|
算法
贪心题:股票买卖 II
贪心题:股票买卖 II
69 0
|
机器学习/深度学习 算法 网络协议
|
机器学习/深度学习 存储 算法
贪心算法
贪心算法
384 0
贪心算法
|
算法 C++
Huffman树(贪心)
复习acwing算法基础课的内容,本篇为讲解基础算法:贪心——Huffman树,关于时间复杂度:目前博主不太会计算,先鸽了,日后一定补上。
101 0
Huffman树(贪心)