CCSP2016-1 选座(ticket_chooser)

2023-05-16

CCSP2016-1 选座(ticket_chooser)

【题目描述】
小 B 是一个电影迷,只要有时间,她就要去观摩最新的大片。但她不喜欢自己在 电脑或其他电子设备上观看,而是喜欢去电影院,因为她觉得那里更有气氛。 由于工作关系,小 B 这次被派到 A 地一段时间,她发现这里的电影院和她熟悉的 模式完全不同。 电影院内部都是正方形的,一共有 k 排,从前到后按照 1 到 k 编号,每排内有 k 个座位,从左到右按照 1 到 k 编号,其中 k 为奇数。 考虑到安全因素,座位不允许购票者自行挑选,而是由售票人员通过电脑程序确定。 由于大家都希望有更好的观影效果,因此一般都倾向于选择更靠近影院中心的座位。 电脑程序选择座位的过程为: 如果有人需要购买 m 张电影票,程序首先会确定一个排号 x,并从中选择一段连 续且尚未售出的座位号 [l,r] ,其中 r−l + 1 = m 。 如果没有任何一排中有 m 个连续的空座位,则电脑程序会报错,在这个购票请求 中将不会卖出任何票。 在保证选出的座位在同一排且座位号连续的前提下,程序会选择最 ‘‘接近中心’’ 的 座位。 具体来说,令 x c x_{c} xc = y c y_{c} yc = (k+1)/2 ,表示影院中最中心的座位。定义选出的这些座位到 影院中心的距离函数为:
∑ i = l r ∣ x − x c ∣ + ∣ i − y c ∣ \sum_{i=l}^{r}|x−x_{c}|+|i−y_{c}| i=lrxxc+iyc

最 ‘‘接近中心’’ 的座位为能最小化上述函数的座位。若有多个可选座位均满足离影 院中心距离最小的条件,则选座程序优先选择靠前的座位(即排号 x 最小的座位)。若 仍有多个座位符合要求,则选座程序优先选择靠左的座位(即座位号 l 值最小的座位)。 假设电影院最开始没有售出任何座位,小 B 希望知道对于给出的 n 个购票请求, 每次售出的票都能买到哪些座位?
【输入描述】
输入包含多组数据,你需要用判断是否读到文件末尾的形式判断输入是否结束。 每组数据的第一行包含两个正整数 n 和 k,表示购票请求的数量和影院大小。保证 1≤n≤300,000,1≤k≤300,001,且 k 为奇数。 第二行为空格分隔的 n 个正整数,其中第 i(1 ≤i≤n)个数为 mi,表示每次要求 购买的票数,保证 1≤mi ≤k。
【输出描述】
每组数据输出包含 n 行,每个购买请求的结果为一行。0 如果无法在一排中买到 mi 个连续的座位,则在对应的行中输出 −1。否则输出三个 空格分隔的整数 x,l,r,为所买电影票的排号和起止座位号。
【样例 1 输入】
2 1
1 1
4 3
1 2 3 1
【样例 1 输出】
1 1 1
-1
2 2 2
1 1 2
3 1 3
2 1 1
【子任务】
对于 20% 的测试数据,n≤50,k≤25;
对于 40% 的测试数据,n≤100,k≤101;
对于 50% 的测试数据,n≤1000,k≤501;
对于 60% 的测试数据,n≤1000,k≤1001;
对于 70% 的测试数据,n≤50000,k≤50001;
对于 80% 的测试数据,n≤100000,k≤100001;
对于 90% 的测试数据,n≤200000,k≤200001;
对于 100% 的测试数据,n ≤ 300000,k ≤ 300001 ,保证每个测试点的数据组数不 超过 5 组。

#include<iostream>  
#include<stdio.h>  
#include<string.h>  
#include<fstream>  
#include<math.h>  
  
using namespace std;  
  
const int K=300002;  
const int N=300001;  
//因为要尽量往中间坐,所以每排只要有人必定连座   
//L[i]:从中间往两边指向左边第一个空位置,R[i]同理。   
int L[K],R[K],n,k,s,x,start,end,l,r,temp;  
  
int dis(int x,int l,int r){  
    int sum=0,f=(k+1)/2;  
    for(int i=l;i<=r;i++)  
        sum+=(abs(f-x)+abs(f-i));  
    return sum;  
}  
  
void getseat(int &temp,int &i,int &s,int &x,int &l,int &r,int &start,int &end){  
    temp=dis(i,start,end);
    if (temp<s)  
        s=temp,x=i,l=start,r=end;  
    else if (temp==s&&i<x)  
        x=i,l=start,r=end;  
    else if (temp==s&&i==x&&start<l)  
        l=start,r=end;  
}  
  
int main(){  
    ifstream ifile("1in.txt");  
    while(1){  
        ifile>>n>>k;  
        if(ifile.eof())  
            break;  
        for(int i=1;i<=k;i++){  
            L[i]=(k+1)/2;  
            R[i]=(k+1)/2;  
        }  
        while(n--){  
            int m;  
            s=0x7fffffff;  
            ifile>>m;  
            for(int i=1;i<=k;i++){  
                if(L[i]==R[i]&&(m&1)){  
                    start=(k+1)/2-(m+1)/2+1; end=(k+1)/2-(m+1)/2+m;  
                    getseat(temp,i,s,x,l,r,start,end);  
                }else if(L[i]==R[i]){  
                    start=(k+1)/2-m/2; end=(k+1)/2+m/2-1;  
                    getseat(temp,i,s,x,l,r,start,end);  
                }  
                if(L[i]>=m){  
                    start=L[i]-m+1; end=L[i];  
                    getseat(temp,i,s,x,l,r,start,end);  
                }  
                if(R[i]+m-1<=k){  
                    start=R[i]; end=R[i]+m-1;  
                    getseat(temp,i,s,x,l,r,start,end);  
                }  
            }  
            if(s==0x7fffffff){  
                printf("-1\n");  
                continue;  
            }  
            L[x]=min(L[x],l-1);//可能落座在右半边,所以要与原值比较   
            R[x]=max(R[x],r+1);  
            printf("%d %d %d\n",x,l,r);  
        }  
    }  
    return 0;   
}   
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

CCSP2016-1 选座(ticket_chooser) 的相关文章

  • MySQL 多对多条件查询

    两个表 user和role 中间表是user role 查询用户和角色的对应关系 select res user name r role name from select u user name ur role id from user a
  • spring Bean相关配置及对象的生命周期

    名称与表示 xff1a id 使用了约束中的唯一约束 xff0c 里面不能出现特殊字符 name 没有使用唯一约束 xff0c 可以出现特殊字符 xff08 一般不使用 xff09 设置对象生命周期的方法 xff1a init method
  • 新博客开通

    xff01 xff5e 今天终于决定开博客了 并决定把全部觉得重要的东西都记录下来 每次都记录下来 然后一段时间再来总结一次 xff5e 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61
  • mybatis 代码生成器及多表联查的细节

    在使用mybatis代码生成器时 xff0c 若生成的字段要为布尔类型 xff0c 则在设计表时 xff0c 将字段属性设置为tinyint 长度设为1 这样 生成的domain中的 相应字段类型为布尔类型 如数据库中的字段类型为date或
  • yml自定义属性和值

    测试类 xff1a import com spx App import com spx config MyProperties import org junit Test import org junit runner RunWith im
  • 导出数据提示--secure-file-priv选项问题的解决方法

    mysql可使用 into outfile 参数把表中数据导出到csv xff0c 例如可用以下命令把user表的数据导出到user csv 1 select from user into outfile 39 tmp user csv 3
  • 如何在 Ubuntu 22.04 LTS 中添加、删除和授予用户 Sudo 权限

    本教程介绍如何在 Ubuntu Linux 操作系统中添加 删除和授予用户Sudo权限 1 什么是Sudo xff1f 在 Linux 和 Unix 操作系统中 xff0c 有一个特殊的用户叫做 root xff0c 用户可以在root类
  • 数据库-查询选修了3门课程以上的学生的学号

    Aim 查询选修了3门课程以上的学生的学号 Data 其中Sno字段为student表的外键 xff0c Cno字段为course表的外键 ScID int Sno char 7 Cno char 10 Grade int isTec va
  • Docker 构建镜像(docker build)

    版权所有 xff0c 未经许可 xff0c 禁止转载 章节 Docker 介绍Docker 和虚拟机的区别Docker 安装Docker HubDocker 镜像 xff08 image xff09 Docker 容器 xff08 cont
  • Linux常用指令--防火墙

    Linux在防火墙中打开端口 xff1a 添加端口 sudo firewall cmd add port 61 1431 tcp permanent sudo firewall cmd add port 61 1432 tcp perman
  • 阿里云 服务器 安全组规则配置 无效怎么办?

    引子 买了一台阿里云 服务器 项目部署后 用公网ip死活访问不了 改安全组规则 也没用经查阅 资料后 发现是防火墙问题 解决方案 服务器 os ubuntu 一般情况下 xff0c ubuntu安装好的时候 xff0c iptables会被
  • 三种方法求最大公约数GCD及求最小公倍数LCM

    使用三种方法求最大公约数 1 辗转相除法 span class hljs comment 辗转相除法求最大公约数 span span class hljs keyword public span span class hljs keywor
  • [php笔记]html的表单

    最近刚完成一个asg 是一个简单的学生 xff0c 课程的管理系统 基于web的 xff0c 利用LAMP linux 43 apache 43 mysql 43 php xff09 实现的一个小的系统 由于之前没太接触过php 这次开发用
  • 用Python来查询聊天记录

    前言 用Python来查询聊天记录 代码 import re def Start First Date Second Date First Name Second Name First 61 re compile f 39 First Da
  • [指南] 如何在Windows 10/11 WSL上安装Ubuntu 21.10等新版本

    WSL子系统目前已经支持多个Linux 发行版 xff0c 不过什么时候发布更新这需要开发商或社区及时适配然后上架商店 例如目前在微软商店里可以下载Ubuntu和Ubuntu 20 04 LTS长期支持版 xff0c Ubuntu 21 1
  • https免费证书获取方式

    来此加密 1 前往来此加密官网申请证书https letsencrypt osfipin com 2 申请证书 xff0c 3 验证证书 xff1a dns验证 xff1a 前往所在云dns解析服务https认证 xff1a 使用nginx
  • java设置ContentType,设置下载文件名称

    java设置ContentType xff0c 设置下载文件名称 根据上传文件名设置ContentType设置下载文件名称 根据上传文件名设置ContentType 几种常用上传文件如下 xff1a span class token key
  • WPS word关联Mathtype的方法

    一 首先安装Mathtype7 4 1 链接 xff1a https handong1201 lanzoui com itJMjsf1zih 2 解压下载下来的Mathtype7 4安装包及补丁 zip 3 双击MathType win z

随机推荐