zoukankan      html  css  js  c++  java
  • HihoCoder1705: 座位问题(STL)

    描述

    HIHO银行等待区有一排N个座位,从左到右依次编号1~N。现在有M位顾客坐在座位上,其中第i位坐在编号Ai的座位上。  

    之后又陆续来了K位顾客,(K + M ≤ N) 他们都会选择坐在最"舒适"的空座位上,并且过程中没有顾客离开自己的座位。  

    最"舒适"的定义是:  

    1. 对于一个座位,我们将它左边连续的空座位数目记作X,它右边连续的空座位数目记作Y。  

    2. 顾客首先会选择min(X, Y)最大的座位。

    3. 如果有多个选择,顾客会选择其中max(X, Y)最大的座位。  

    4. 如果还是有多个选择,顾客会选择其中编号最小的座位。

    请你计算出之后来的K位顾客坐在几号座位上。

    输入

    第一行包含三个整数N,M和K。  

    第二行包含M个整数A1, A2, ... AM。  

    对于50%的数据,1 ≤ N ≤ 1000  

    对于100%的数据,1 ≤ N ≤ 100000,  1 ≤ Ai ≤ N,  K + M ≤ N

    输出

    输出K行,每行一个整数代表该位顾客座位的编号。

    样例输入

    10 2 3  
    1 10

    样例输出

    5  
    7  
    3

    题意:其实就是要坐在最长的空白处的中间,如果有多个长度相同的,选择左边那个。

    思路:STL单调队列保存每一段空白,以长度为第一关键字,位置为第二关键字。每次坐进来一个人,会把一段空白分成两段空白,把两个新的插入队列里。

    因为说了最后依然有空位,所以不必考虑越界的情况。

    #include<queue>
    #include<cstdio>
    #include<cstdlib>
    #include<iostream>
    #include<algorithm>
    using namespace std;
    const int maxn=100010;
    struct in
    {
        int id;int l;int r;
        in(){}
        in(int x,int y,int z):id(x),l(y),r(z){}
        friend bool operator < (in a,in b){
            if(a.r-a.l==b.r-b.l) return a.id>b.id; 
            return a.r-a.l<b.r-b.l;
        }
    };
    int a[maxn],used[maxn],L[maxn],R[maxn];
    priority_queue<in>q;
    int main()
    {
        int N,M,K,i,j;
        scanf("%d%d%d",&N,&M,&K);
        used[0]=1; used[N+1]=1;
        for(i=1;i<=M;i++) scanf("%d",&a[i]);
        sort(a+1,a+M+1);
        a[0]=0;a[M+1]=N+1;
        for(i=1;i<=M+1;i++) {
            L[i]=a[i-1]+1; R[i]=a[i]-1;
            q.push(in((L[i]+R[i])/2,L[i],R[i]));
        }
        for(i=1;i<=K;i++){
            in tmp=q.top(); q.pop();
            printf("%d
    ",tmp.id);
            q.push(in((tmp.id-1+tmp.l)/2,tmp.l,tmp.id-1));
            q.push(in((tmp.r+tmp.id+1)/2,tmp.id+1,tmp.r));
        }
        return 0;
    }
  • 相关阅读:
    Domino
    tomcat 部署 外网访问
    市场4
    android 源码下载编译
    SSIS
    代码审查工具
    mfc 常用控件
    屏蔽home
    MFC BEGIN_MESSAGE_MAP()
    社交产品
  • 原文地址:https://www.cnblogs.com/hua-dong/p/8544706.html
Copyright © 2011-2022 走看看