原文详见:https://blog.csdn.net/tigerisland45/article/details/54798869

试题编号: 201609-2
试题名称: 火车购票
时间限制: 1.0s
内存限制: 256.0MB
问题描述
  请实现一个铁路购票系统的简单座位分配算法,来处理一节车厢的座位分配。
  假设一节车厢有20排、每一排5个座位。为方便起见,我们用1到100来给所有的座位编号,第一排是1到5号,第二排是6到10号,依次类推,第20排是96到100号。
  购票时,一个人可能购一张或多张票,最多不超过5张。如果这几张票可以安排在同一排编号相邻的座位,则应该安排在编号最小的相邻座位。否则应该安排在编号最小的几个空座位中(不考虑是否相邻)。
  假设初始时车票全部未被购买,现在给了一些购票指令,请你处理这些指令。
输入格式
  输入的第一行包含一个整数n,表示购票指令的数量。
  第二行包含n个整数,每个整数p在1到5之间,表示要购入的票数,相邻的两个数之间使用一个空格分隔。
输出格式
  输出n行,每行对应一条指令的处理结果。
  对于购票指令p,输出p张车票的编号,按从小到大排序。
样例输入
4
2 5 4 2
样例输出
1 2
6 7 8 9 10
11 12 13 14
3 4
样例说明
  1) 购2张票,得到座位1、2。
  2) 购5张票,得到座位6至10。
  3) 购4张票,得到座位11至14。
  4) 购2张票,得到座位3、4。
评测用例规模与约定
  对于所有评测用例,1 ≤ n ≤ 100,所有购票数量之和不超过100。

解题思路
用数组或是map存储数据,数组会导致重复搜索,map逻辑稍微复杂些。下面是用map的解法,是我看了某大佬的解法之后,给它做了一个详细的注释,需要理解的地方都有说明。要考虑到同排分配和多排分配的情况,其输出是不同的。

首先了解一下map的大致作用:

下面是大佬的代码以及注释:

#include<iostream>
#include<map> using namespace std;const int N=20;
const int NUM=5;
int main()
{map<int,int>m;int n,v,start,end;//初始化火车票 剩余张数 for(int i=1;i<=N;i++)m[i]=NUM;//输入操作次数 cin>>n;for(int i=1;i<=n;i++){//输入购买张数 cin>>v;//一边输入一边分配// 同一排分配 for(map<int,int>::iterator it=m.begin();it!=m.end();it++){//这一排的剩余票数大于或等于要购买的票数if(it->second>=v){//计算出 分配座位的 起始位置 和 结束位置 的座位编号 start = (it->first-1)*NUM + (NUM-it->second+1);end = start + v -1;//依次输入分配到的座位编号 for(int j=start;j<=end;j++){// 换行从第一个位置输出if(j!=start)cout<<" ";cout<<j;    }cout<<endl;//对于已经分配完毕的排,删除//该排的余票数量刚好与要分配的票数相等 if(it->second==v)m.erase(it); elseit->second=it->second-v;//表示分配完成跳出本次循环//没有这条语句会运行超时 v=0;break;        } } //多排分配车票// 用于标记第一个输出 //是在分配过的排的基础上再分配 bool nofirstflag=false;while(v>0){for(map<int,int>::iterator it=m.begin();it!=m.end();it++){if(it->second>=v){start=(it->first-1)*NUM+(NUM-it->second+1);end=start+v-1;for(int j=start;j<=end;j++){if(nofirstflag)cout<<" ";cout<<j;nofirstflag=true;}//票分配完的排,删除 if(it->second==v)m.erase(it);elseit->second=it->second-v; v=0;break; }// 某一排的票数不够需要分配到另一排 else{start=(it->first-1)*NUM+(NUM-it->second+1);end=start+it->second-1;for(int j=start;j<=end;j++){if(nofirstflag)cout<<" ";cout<<j;nofirstflag=true; }//还需要被分配的票数 v=v-it->second;m.erase(it);  }} cout<<endl;}     }return 0;
} 

用数组存储可能会容易理解些,数组在某种程度上也可以化为map。如图存储数据:

下面是通过用数组存储的满分代码:

#include<iostream>
using namespace std;const int N=20;
const int NUM=5;
int main()
{int p[N];//存储每一排的余票数量int start,end,v;for(int i=1;i<=N;i++)p[i]=NUM;int n;cin>>n;while(n--){cin>>v;for(int i=1;i<=N;i++){if(p[i]>=v){start=(i-1)*NUM+NUM-p[i]+1;end=start+v-1;for(int j=start;j<=end;j++){if(j!=start)cout<<" ";cout<<j;  }cout<<endl;p[i]=p[i]-v;cout<<"p[i]"<<p[i]<<" i="<<i<<endl;v=0;break; }}bool nofirstflag=false;while(v>0){for(int i=1;i<=N;i++){if(p[i]>=v){start=(i-1)*NUM+NUM-p[i]+1;end=start+v-1;for(int j=start;j<=end;j++){if(nofirstflag)cout<<" ";cout<<j;nofirstflag=true;    }p[i]=p[i]-v;cout<<"p[i]"<<p[i]<<" i="<<i<<endl;v=0;break;}else{start=(i-1)*NUM+NUM-p[i]+1;end=start+p[i]-1;for(int j=start;j<=end;j++){if(nofirstflag)cout<<" ";cout<<j;nofirstflag=true;}v=v-p[i];cout<<"p[i]"<<p[i]<<" i="<<i<<endl;p[i]=0;}}}  }return 0;
}

【CCF】201609-2火车购票相关推荐

  1. CCF CSP 201609-2 火车购票

    题目链接:http://118.190.20.162/view.page?gpid=T46 问题描述 请实现一个铁路购票系统的简单座位分配算法,来处理一节车厢的座位分配. 假设一节车厢有20排.每一排 ...

  2. CCF CSP 201609-2 火车购票(C++语言100分)[简单模拟题]

    1. 问题链接:CCF 201609-2 火车购票 试题编号: 201609-2 试题名称: 火车购票 时间限制: 1.0s 内存限制: 256.0MB 问题描述: 问题描述 请实现一个铁路购票系统的 ...

  3. CCF CSP 201609-2 火车购票(90分,怎么也检查不出来问题在哪儿,导致不能满分??)

    问题描述 试题编号: 201609-2 试题名称: 火车购票 时间限制: 1.0s 内存限制: 256.0MB 问题描述: 问题描述 请实现一个铁路购票系统的简单座位分配算法,来处理一节车厢的座位分配 ...

  4. CCF CSP 201609-2 火车购票 C++实现 100分

    问题描述 请实现一个铁路购票系统的简单座位分配算法,来处理一节车厢的座位分配. 假设一节车厢有20排.每一排5个座位.为方便起见,我们用1到100来给所有的座位编号,第一排是1到5号,第二排是6到10 ...

  5. CCF:201609-2 火车购票

    问题描述 试题编号: 201609-2 试题名称: 火车购票 时间限制: 1.0s 内存限制: 256.0MB 问题描述: 请实现一个铁路购票系统的简单座位分配算法,来处理一节车厢的座位分配. 假设一 ...

  6. CCF201609-2 火车购票

    问题描述: 试题编号: 201609-2 试题名称: 火车购票 时间限制: 1.0s 内存限制: 256.0MB 问题描述: 问题描述 请实现一个铁路购票系统的简单座位分配算法,来处理一节车厢的座位分 ...

  7. # CSP 201609-2 火车购票购买(100分)

    试题编号: 201612-2 试题名称: 火车购票 时间限制: 1.0s 内存限制: 256.0MB 问题描述 请实现一个铁路购票系统的简单座位分配算法,来处理一节车厢的座位分配. 假设一节车厢有20 ...

  8. ## CSP 201609-2 火车购票购买,C语言版(90分版)

    试题编号: 201612-2 试题名称: 火车购票 时间限制: 1.0s 内存限制: 256.0MB 问题描述 请实现一个铁路购票系统的简单座位分配算法,来处理一节车厢的座位分配. 假设一节车厢有20 ...

  9. CCF201609-2 火车购票(100分)

    试题编号: 201609-2 试题名称: 火车购票 时间限制: 1.0s 内存限制: 256.0MB 问题描述: 问题描述 请实现一个铁路购票系统的简单座位分配算法,来处理一节车厢的座位分配. 假设一 ...

最新文章

  1. C:#define用法
  2. object detection
  3. Java this 关键字的用法
  4. flutter 底部动画导航栏
  5. 在net.tcp模式下,由SvcUtil.exe生成代理类文件和配置文件(转)
  6. 无法定位程序输入点 InitializeCriticalSectionEx 于动态链接库 Kernel32.dll 上 问题解决方法
  7. r720换固态硬盘后如何重装系统_联想R720重装Winddows10无法识别固态硬盘咋办
  8. 1日元是多少人民币(2014年04月23日)
  9. 从西洋跳棋开始机器学习
  10. 相同的js文件在IE浏览器可以响应,但是在Chrome浏览器上没有响应
  11. Android电子白板
  12. btrfs和ntfs linux5,如何选择文件系统EXT4、Btrfs 和 XFS
  13. 基于负熵的快速不动点算法
  14. 掌门教育:品质为本,全面打造高质量教学核心驱动力
  15. Android Wear 开发 (一),移动应用开发技术
  16. Android】中微信抢红包助手的实现(代码整理)
  17. 1的365次方=1, 1.01的365次方=???
  18. 轮循码/轮巡码/轮询码
  19. Dao DAL BIZ
  20. 企业维生素CRM云技术漫步云端,传统供求模式备受挑战

热门文章

  1. 使用pip安装包提示TLS证书错误解决办法
  2. SSH远程管理,构建密钥对验证的SSH体系,设置SSH代理功能。
  3. 大量开发者会将访问token和API密钥硬编码至Android应用
  4. input上报流程分析【转】
  5. Windows Server 2008 R2 域控DOS命令
  6. 迷宫(AHOI2016初中组T3)
  7. 综合技术 --web.xml
  8. 十四个方法提高博客的页面访问量
  9. SpringMVC 解决中文乱码的过滤器
  10. 【Java】输入三角形的三边长,求三角形的面积