CCSP2016-1 选座(ticket_chooser)

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

最 ‘‘接近中心’’ 的座位为能最小化上述函数的座位。若有多个可选座位均满足离影 院中心距离最小的条件,则选座程序优先选择靠前的座位(即排号 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;
}

CCSP2016-1 选座(ticket_chooser)相关推荐

  1. swing 实现电影选座系统

    该系统使用swing+数据库 实现一个电影选座系统,相关系统的截图如下 使用三层架构实现电影购票系统,分用户和管理员,用户功能:展示电影,查找电影(模糊查询),查看电影详情,查找场次,购买影票,订制座 ...

  2. 首次揭秘!大麦如何应对超大规模高性能选座抢票?

    作者|  阿里文娱技术专家恒磊.高级开发工程师新钱 出品 | AI科技大本营(ID:rgznai100) 背景介绍 随着现场娱乐行业的不断发展,各类演出层出不穷,越来越多的演出开启选座购票满足用 户的 ...

  3. 怎么把代码放图片里面进行注入_【5025Bridge V1.0】(三)连接、选座、准备的代码搭建...

    (三)连接.选座.准备的代码搭建 [概览]在这篇文章中,我主要使用信号机制实现了服务器和客户端之间的通信,并自己摸索着做出了选座的界面,初步设计并构建了各种按钮之间逻辑.此文多图,纯文字量约10000 ...

  4. d3 svg path添加文本_10 倍高清不花!大麦端选座 SVG 渲染

    作者 | 阿里文娱无线开发专家 波涛 责编 | 夕颜 出品 | CSDN(ID:CSDNnews) 背景介绍 用户在大麦上购票,需要自行选座.在大型场馆下,如何让 10 万+座位绘制达到闪开?这需要技 ...

  5. java电影票选座_jQuery实现电影票选座效果手机端代码

    部分js代码 //判断页面加载完成 window.onload = function () { if (document.readyState == "complete") { $ ...

  6. android studio电影院选座,8排电影院选座最佳位置

    8排电影院选座最佳位置在哪里呢?8排电影院属于小影厅,小影厅银幕宽度在10米以下,座位100以内,座位排数通常拥有8-14排,小影厅整体空间小,选座时要选中间稍靠后一些的位置.由于整体排数少,因此选即 ...

  7. jQuery在线选座订座(影院篇)

    jQuery在线选座订座(影院篇) 原文:jQuery在线选座订座(影院篇) 我们在线购票时(如电影票.车票等)可以自己选座.开发者会在页面上列出座次席位,用户可以一目了然的看到可以选择的座位及支付. ...

  8. css 选座,纯html+css中实现静态选座位效果技巧(input+label使用小技巧)

    很多时候,我们想通过html+css的方式实现排列在后方的代码在选中状态下,能控制排列在前的代码的样式.那么要怎么实现呢?在这里我就要用1个小技巧来完成. 众所周知的,我们css中的选择器通常只能向下 ...

  9. 微信小程序订票选座PHP后台网站MySQL数据库和无前端小程序版本两个程序

    微信小程序订票选座PHP后台网站MySQL数据库和无前端小程 下载点此去 两个相同功能 差别在一个有前端微信小程序 一个没有 (1)登录功能:注册普通账号登录:也可以直接使用微信登录:登录后可以修改用 ...

最新文章

  1. 软件定义的网络体系结构是否使用网段路由?—Vecloud微云
  2. Fast R-CNN《Fast R-CNN》论文笔记
  3. promise存在的意义分析resolve reject catch
  4. 中年女子颈肩手肿痛案
  5. 运算符的计算机制和原则
  6. Eclipse新建项目里没有Web Project应该如何处理
  7. 不同路径 II-dp
  8. python代做在哪找靠谱_比较靠谱的资产评估师考试去哪找
  9. android蓝牙控制继电器——手机客户端的实现
  10. web前端项目实例网站_2020最全web前端项目实战课程(含项目实战+源码)
  11. python搭建bs架构_bs架构设计方案的.doc
  12. Ubuntu显卡驱动安装
  13. Mbed记录 STM32F207ZG板子引脚图
  14. Note8 android 9 root,三星Note8 国行 root N9500 9.0 root N9500ZCS6DTC1 root
  15. 怎么查看电脑是不是禁ping_电脑ping怎么打开怎么检测网络连接是否正常 ping网络教程...
  16. 网页加速之Link prefetching
  17. 计算机u盘病毒清除方式,彻底清除u盘病毒有什么方法呢
  18. 【树莓派】更新树莓派SD卡测速一键脚本,SD卡读写速度测试
  19. HDU 6833 莫比乌斯反演 + 数论分块
  20. STM32F4-usb_slave u盘

热门文章

  1. 数学建模-模拟退火算法-函数寻优(优化模型)
  2. 上位机控制plc,上位机控制软件,ATECLOUD中国人自己的LabVIEW
  3. 文件共享两台电脑不同步
  4. PHP中json_encode与json_decode用法
  5. 两个关于自媒体短视频创作运营的问题及解决方案
  6. 计算机网络原理自考常考,计算机网络原理自考_大题__归类复习剖析
  7. 光影切割问题之求解逆序数
  8. 用MATLAB实现OFDM仿真分析
  9. Datagridview操作性能慢的问题
  10. html计算年龄代码,js+html实现周岁年龄计算器