34-语言入门-34-房间安排

题目地址:?http://acm.nyist.net/JudgeOnline/problem.php?pid=168?

?

描述
2010年上海世界博览会(Expo2010),是第41届世界博览会。于2010年5月1日至10月31日期间,在中国上海市举行。本次世博会也是由中国举办的首届世界博览会。上海世博会以“城市,让生活更美好”(Better City,Better Life)为主题,将充分探索21世纪城市生活。
这次世博会总投资达450亿人民币,创造了世界博览会史上的最大规模记录。吸引200个国家和国际组织参展。预计有7000万人次的参观者。
为了更好地接待在这期间来自世界各地的参观者,如何合理安排各宾馆的住房问题提到了日程。组委会已接到了大量的客户住宿定单,每张定单的内容包括要住宿的房间数,开始住宿时间和要住的天数。为了便于整个城市各宾馆的管理,组委会希望对这些定单进行安排,目的是用尽可能少的房间来满足这些定单,以便空出更多的房间用于安排流动游客。
组委会请求DR.Kong来完成这个任务,对这些定单进行合理安排,使得满足这些定单要求的房间数最少。
假设:某个定单上的游客一旦被安排到某房间,在他预定住宿的期间内是不换房间的。为了简化描述,定单上的开始住宿时间为距离现在的第几天。例如,定单为(10,30,5)表示游客要求使用10个房间,第30天开始连住5天。

输入
第一行:T 表示有T组测试数据
每组测试数据第一行:N 表示定单数
每组测试数据接下来有N行,每行有三个整数 A B C 表示房间数,开始住宿时间和天数
1<=T<=100
1<=N<=10000 1<=A<=10 1<=B<=180 1<=c<=10
输出
输出一个整数,为满足所有定单要求的最少房间数。
样例输入
1
3
3 10 4
4 9 3
3 12 6
样例输出

7

?

?

笨办法:

#include <stdio.h>
#include <stdlib.h>

typedef struct _Order
{
??? //房间数目
??? int roomNum;
??? //开始时间
??? int startTime;
??? //总天数
??? int totalDate;
??? //临时剩余房间
??? int tmpRoomNum;
}Order;

//处理每组数据
void handlerData();

int main()
{
??? int readLen = 0;
??? scanf("%d",&readLen);
??? getchar();
???
??? while (readLen > 0)
??? {
??????? handlerData();
???????
??????? --readLen;
??? }
???
??? return 0;
}

void printResult(Order *arr,int len)
{
??? printf("\n--------------\n");
??? int i=0;
??? for (; i<len; ++i)
??? {
??????? printf("??? %d %d %d\n",arr[i].roomNum,arr[i].startTime,arr[i].totalDate);
??? }
??? printf("--------------\n");
}

//处理每组数据
void handlerData()
{
??? int readLen = 0;
??? scanf("%d",&readLen);
??? getchar();
???
??? Order *orderLst = (Order*)malloc(sizeof(Order)*readLen);
??? int arr_len = readLen;
???
??? int index = 0;
??? while (readLen > 0)
??? {
??????? scanf("%d %d %d",&orderLst[index].roomNum,&orderLst[index].startTime,&orderLst[index].totalDate);
??????? getchar();
??????? orderLst[index].tmpRoomNum = orderLst[index].roomNum;
??????? ++index;
???????
??????? --readLen;
??? }
???
??? //printResult(orderLst,arr_len);
???
??? //排序
??? int i=0;
??? for (; i<arr_len-1; ++i)
??? {
??????? int minIndex = i;
??????? int j = i+1;
??????? for (; j<arr_len; ++j)
??????? {
??????????? if (orderLst[minIndex].startTime > orderLst[j].startTime)
??????????? {
??????????????? minIndex = j;
??????????? }
??????? }
???????
??????? if(minIndex != i)
??????? {
??????????? Order tmpOrder = orderLst[i];
??????????? orderLst[i] = orderLst[minIndex];
??????????? orderLst[minIndex] = tmpOrder;
??????? }
??? }
???
??? //处理数据
??? i=0;
??? for (; i<arr_len-1; ++i)
??? {
??????? if (orderLst[i].roomNum>0 && orderLst[i].tmpRoomNum>0)
??????? {
??????????? int j = i+1;
??????????? int nextStart = orderLst[i].startTime+orderLst[i].totalDate;
??????????? for (; j<arr_len; ++j)
??????????? {
??????????????? if (nextStart <= orderLst[j].startTime && orderLst[j].roomNum>0)
??????????????? {
??????????????????? if (orderLst[j].roomNum > orderLst[i].roomNum)
??????????????????? {
??????????????????????? orderLst[i].tmpRoomNum = 0;
??????????????????????? orderLst[j].roomNum -= orderLst[i].roomNum;
??????????????????????? orderLst[j].tmpRoomNum = orderLst[j].roomNum;
??????????????????????? break;
??????????????????? }
??????????????????? else
??????????????????? {
??????????????????????? orderLst[i].tmpRoomNum -= orderLst[j].roomNum;
??????????????????????? orderLst[j].roomNum = orderLst[j].tmpRoomNum = 0;
??????????????????? }
??????????????? }
??????????? }
??????? }
??? }
???
??? //printResult(orderLst,arr_len);
???
??? //计算总数量
??? int sum = 0;
??? i=0;
??? for (; i<arr_len; ++i)
??? {
??????? sum += orderLst[i].roomNum;
??? }
???
??? //输出结果
??? printf("%d\n",sum);
???
??? free(orderLst);
??? orderLst = NULL;
}

首先考虑数据如何存储,然后考虑数据如何处理解决问题。

该种思路在对数据处理过程种,花费时间过多。

?

?

另一种思路,就是要找到数据的规律,如果将开始时间作为横轴,房间数作为Y轴,形成一个坐标系,每一看成一个矩形条数据,开始时间是X坐标,预定房间的时间是矩形的长,预定房间数是矩形的高。则实例中的三条数据可以形成类似下图:

矩形重叠部分最大值,为最大订约房间数。

?

代码:

#include <stdio.h>

//最大订单数
#define ORDER_LEN? 200

//处理每组数据
static void handlerData();

int main()
{
??? int readLen = 0;
??? scanf("%d",&readLen);
??? getchar();
???
??? while (readLen > 0)
??? {
??????? handlerData();
???????
??????? --readLen;
??? }
???
??? return 0;
}

//处理每组数据
static void handlerData()
{
??? int readLen = 0;
??? scanf("%d",&readLen);
??? getchar();
???
??? int orderArr[ORDER_LEN] = {0};
???
??? while (readLen > 0)
??? {
??????? int homeNum = 0;
??????? int startTime = 0;
??????? int dayNum = 0;
???????
??????? scanf("%d %d %d",&homeNum,&startTime,&dayNum);
??????? getchar();
???????
??????? int j = startTime;
??????? for (; j<startTime+dayNum; ++j)
??????? {
??????????? orderArr[j] += homeNum;
??????? }
???????
??????? --readLen;
??? }
???
??? int i = 1; //1-180
??? int maxRoom = 0;
??? for (; i<ORDER_LEN; ++i)
??? {
??????? if(maxRoom < orderArr[i])
??????? {
??????????? maxRoom = orderArr[i];
??????? }
??? }
???
??? printf("%d\n",maxRoom);
}

时间: 2024-10-12 06:04:27

34-语言入门-34-房间安排的相关文章

【南阳OJ分类之语言入门】80题题目+AC代码汇总

声明: 题目部分皆为南阳OJ题目. 代码部分包含AC代码(可能不止一个)和最优代码,大部分都是本人写的,并且大部分为c代码和少部分c++代码and极少java代码,但基本都是c语言知识点,没有太多差别,可能代码有的写的比较丑,毕竟知识有限. 语言入门部分题基本都较为简单,是学习编程入门的很好练习,也是ACM的第一步,入门的最佳方法,望认真对待. 本文由csdn-jtahstu原创,转载请注明出处,欢迎志同道合的朋友一起交流学习.本人QQ:1373758426和csdn博客地址. now begi

房间安排(第三届省赛)

房间安排 (用一个数组a[]存储某一天内需要住房的房间数, 因为你至少要满足需要在同一天住的人都有房间, 用maxn 存储需要的房间数  不断与a[i]比较) 题目描述 2010年上海世界博览会(Expo 2010),是第41届世界博览会.于2010年5月1日至10月31日期间,在中国上海市举行.本次世博会也是由中国举办的首届世界博览会.上海世博会以“城市,让生活更美好”(Better City, Better Life)为主题,将充分探索21世纪城市生活. 这次世博会总投资达450亿人民币,创

C语言入门(1)——C语言概述

1.程序与编程语言 我们使用计算机离不开程序.程序告诉计算机应该怎样运行.程序(Program)是一个精确说明怎样进行计算的指令序列.这里的计算能够是数学运算,比方通过一些数学公式求解,也能够是符号运算.比方我们使用world编辑一个文档或是通过搜索引擎检索信息. 计算机本质上是由数字电子电路组成的运算机器,全部的运算都仅仅能通过数字来表示和处理.通过将各种数据转换为数字表示,能够使计算机处理各种信息.比方音乐.图片.电影等. 程序由一系列指令组成的,指令就是指挥计算机做某种运算的命令.通常包括

C语言入门(二十五)文件操作

文件操作  一.标准文件的读写 1.文件的打开fopen() 文件的打开操作表示将给用户指定的文件在内存分配一个FILE结构区,并将该结构的指针返回给用户程序,以后用户程序就可用此FILE指针来实现对指定文件的存取操作了.当使用打开函数时,必须给出文件名.文件操作方式(读.写或读写),如果该文件名不存在,就意味着建立(只对写文件而言,对读文件则出错),并将文件指针指向文件开头.若已有一个同名文件存在,则删除该文件,若无同名文件,则建立该文件,并将文件指针指向文件开头. fopen(char *f

第一节,C语言入门

1.标示符:    命名规则:    1.只能由字母.数字.下划线组成    2.不能数字开头    3.不能与关键字重名    4.严格区分大小写    命名规范:     1.起一个有意义名字     2.驼峰标示2.注释 注释: 对代码的解释说明,是写给程序看的,方面程序员之间交流 特点: 注释是不参与编译 /* 这里面可以写 */ 多行注释 // 这是一个单行注释 只有这一行是注释,只有 两个斜杠后面才是注释内容 /* */ command + / 注释或取消注释 多行注释是可以嵌套单行

哪有python开发语言入门教程免费下载?

人工智能时代,如果不想被机器人取代,最应该掌握的是编程.Python作为连续10年最受欢迎的编程语言,不但能开发Google .豆瓣等大型网站,还是人工智能领域的第一语言.那么,我猜你想问哪里有python开发语言入门教程. 千锋Python基础教程:http://pan.baidu.com/s/1qYTZiNE Python课程教学高手晋级视频总目录:http://pan.baidu.com/s/1hrXwY8k Python课程windows知识点:http://pan.baidu.com/

VC6.0学习C语言入门SDK

百度网盘链接 VC6.0    密码:t6bd VS2010 密码:3of2 C语言入门教程 在线视频地址(PS此链接摘抄至博主lellansin) Acfun.tv:http://www.acfun.tv/search.aspx#query=C语言入门教程 Bilibili.tv:http://www.bilibili.tv/search?keyword=C语言入门教程 最后和大家分享一个实现行列式算法的C代码 /*=======================================

《Go语言入门》第一个Go语言Web程序——简单的Web服务器

概述 上一篇讲了 <Go语言入门>第一个Go语言程序--HelloWorld,接下来讲一下Go语言Web开发入门必修课:第一个Go语言Web程序--简单的Web服务器. 与其它Web后端语言不同,Go语言需要自己编写Web服务器. 有关本地环境的搭建与基础学习,请参考: <Go语言入门>如何在Windows下安装Go语言编程环境 Go语言Web应用:IBM的云平台Bluemix使用初体验--创建Go语言 Web 应用程序,添加并使用语言翻译服务 Web服务器代码 Google在ht

简单易懂的程序语言入门小册子(9):环境,引入环境

\newcommand{\mt}[1]{\text{#1}} \newcommand{\mE}{\mathcal{E}} \newcommand{\tup}[1]{\left<{#1}\right>} 环境类似于其他语言(C++.JAVA等)的"符号表". 所谓符号表,是一张将变量名与变量代表的内容联系起来的一张表. 不过这里我们抛弃符号表的观点,单纯地从算法角度上引入环境这一概念. 引入环境 通过修改解释器求值过程的算法,可以很自然的引入环境这个概念. 在前面基于文本替换

简单易懂的程序语言入门小册子(6):基于文本替换的解释器,引入continuation

当我写到这里的时候,我自己都吃了一惊. 环境.存储这些比较让人耳熟的还没讲到,continuation先出来了. 维基百科里对continuation的翻译是"延续性". 这翻译看着总有些违和感而且那个条目也令人不忍直视. 总之continuation似乎没有好的中文翻译,仿佛中国的计算机科学里没有continuation这个概念似的. Continuation这个概念相当于过程式语言里的函数调用栈. 它是用于保存"现在没空处理,待会再处理的事"的数据结构. 这样说