zoukankan      html  css  js  c++  java
  • 单调队列练习题(oj p1157 p1158 p1159)

    p1157是很气人的...自从评测机挂了后,速度就特别慢,cin已经过不了了,然而我不知道,就各种**的提交

    惨兮兮惨兮兮,这还是开了小号(通过率堪忧.jpg...)...

    思路就是单调队列维护,用队列存储k个数中最小数下标......还是代码加注释好懂

    #include <bits/stdc++.h>
    using namespace std;
    int n,k;
    int qm[1000006],tail=1,head=1;
    int a[1000006];
    int main()
    {
    cin>>n>>k;
    for(int i=1;i<=n;i++)
    scanf("%d",&a[i]);
    qm[head]=1;
    for(int i=2;i<=k;i++)
    {
    while(a[i]<a[qm[tail]]&&tail>=head)//维护单调递减,在k个数内,如果当前元素有小于队尾元素(队列中下标对应原数组中的数)
    tail--;//出队
    qm[++tail]=i;//入队
    }
    for(int i=k;i<=n;i++)
    {
    if(i-qm[head]==k)//如果i-队头元素下标==k,证明该换最小值了,就head++;
    head++;
    while(a[i]<a[qm[tail]]&&tail>=head)//同上
    tail--;
    qm[++tail]=i;
    cout<<a[qm[head]]<<' ';
    }
    cout<<endl;
    head=1;tail=1;
    qm[head]=1;
    for(int i=2;i<=k;i++)//同上,以下维护单调递增
    {
    while(a[i]>a[qm[tail]]&&tail>=head)
    tail--;
    qm[++tail]=i;
    }
    for(int i=k;i<=n;i++)
    {
    if(i-qm[head]==k)
    head++;
    while(a[i]>a[qm[tail]]&&tail>=head)
    tail--;
    qm[++tail]=i;
    cout<<a[qm[head]]<<' ';
    }
    return 0;
    }

     P1158

    合并果子

    往年的一道noip题,思路还行...然而我被卡了差不多2天,本来想的思路对的,不知道怎么就想偏了。

    总之就是没回从队中抽出最小的两个相加,出队,再将他们的和进队。说实话,如果不用STL,差不多就是一次一排序?或是二重?反正我没想出来....STL优先队列就很方便了

    设一个小的优先级的队列,将最小的两个出队,在将他们的和进队。因为是n堆果子合并,所以实际只需合并n-1次

    #include <bits/stdc++.h>
    using namespace std;
    struct cmp1
    {
    bool operator ()(int x, int y)
    {
    return x > y;//小的优先级高
    }
    };
    priority_queue<int,vector<int>,cmp1>q;
    int n,a,ans=0;
    int main()
    {
    cin>>n;
    for(int i=1;i<=n;i++)
    {
    cin>>a;
    q.push(a);
    }
    for(int i=1;i<=n-1;i++)
    {
    int x,y;
    x=q.top();
    q.pop();
    y=q.top();
    q.pop();
    q.push(x+y);
    ans+=x+y;
    }
    cout<<ans<<endl;
    return 0;
    }

    P1159 假日

    usaco原题。。。感觉我现在想不到算法,决定学完dp再回来补敲

  • 相关阅读:
    React源码 React ref
    数组算法 电话号码组合
    字符串算法 计算子串原理
    React源码 React.Component
    字符串算法 反转单词原理讲解
    React源码 ReactElement
    前端设计模式 中介者模式
    前端设计模式 备忘录模式
    前端设计模式 命令模式
    模拟退火
  • 原文地址:https://www.cnblogs.com/ywjblog/p/7906371.html
Copyright © 2011-2022 走看看