题目2 : Disk Storage

时间限制:10000ms

单点时限:1000ms

内存限制:256MB

描述

Little Hi and Little Ho have a diskstorage. The storage's shape is a truncated cone(截头圆锥体) of height H. R+H is radius oftop circle and R is radius of base circle. 
Little Ho buys N disks today. Every disk is a cylinder of height 1. Little Howants to put these disk into the storage under below constraints:

1. Every disk is placed horizontally. Itsaxis must coincide with the axis of storage.
2. Every disk is either place on the bottom surface or on another disk.
3. Between two neighboring disks in the storage, the upper one's radius minusthe lower one's radius must be less than or equal to M.

Little Ho wants to know how many disks hecan put in the storage at most.

输入

Input contains only one testcase.
The first line contains 4 integers: N(1 <= N <= 100000), M, H, R(1 <=M, R, H <= 100000000).
The second line contains N integers, each number prepresenting the radius of adisk. Each radius is no more than 100000000.

输出

Output the maximum possible number of diskscan be put into the storage.

样例输入

5 1 10 3

1 3 4 5 10

样例输出

4

基本思想就是穷举和递归,因为每选出一个盘子就相当于在R+1,H-1的子空间里放剩下的盘子。

以下内容是我的C++实现,由于本人水平有限,代码肯定存在不合理的地方,欢迎读者能提出意见。


文件1:disk_storage.h

#ifndef _DISK_STORAGE_H_
#define _DISK_STORAGE_H_class DISKS_CL
{public:DISKS_CL(int _iN);~DISKS_CL();DISKS_CL(const DISKS_CL& _clDisks);DISKS_CL& operator=(const DISKS_CL& _clDisks);int GetDiskByIndex(int iIndex) const;//获取一个盘子的半径void DeleteDiskByIndex(int iIndex);//删除一个盘子的半径数据int GetDiskNum() const;//获取问题中盘子的总数private:int iN;//disk numberint *piRadius;//all radiusvoid Input();//输入所有盘子的半径数据
};class STORAGE_CL
{public:STORAGE_CL();~STORAGE_CL();void Input();//输入数据int GetDiskNum();//获取问题中盘子的总数int FindMax(DISKS_CL& clDisks);//找出满足条件的最大存放数目private:int iN;int iH;int iR;int iM;//递归函数int DoFind(int _iH, int _iR, int _iPreIndex, DISKS_CL clDisks);
};#endif

文件2:disk_storage_main.cpp

#include <iostream>#include "disk_storage.h"using namespace std;STORAGE_CL::STORAGE_CL():iN(0),iH(0),iR(0),iM(0)
{Input();return;
}
STORAGE_CL::~STORAGE_CL()
{return;
}
void STORAGE_CL::Input()
{cin>>iN>>iM>>iH>>iR;return;
}int STORAGE_CL::GetDiskNum()
{return iN;
}int STORAGE_CL::FindMax(DISKS_CL& clDisks)
{return DoFind(iR,iH,-1,clDisks);
}int STORAGE_CL::DoFind(int _iR, int _iH, int _iPreIndex, DISKS_CL clDisks)
{int i;int iRadius;int iResult;int iRet;int iPreRadius;if (0 == _iH)//没有空间了{return 0;}if (-1 == _iPreIndex)//第一个盘子{iPreRadius = iRadius - iM;}else//以后的盘子{iPreRadius = clDisks.GetDiskByIndex(_iPreIndex);clDisks.DeleteDiskByIndex(_iPreIndex);}iResult = 0;for (i=0; i<iN; i++)//对所有盘子循环{iRadius = clDisks.GetDiskByIndex(i);if (0 == iRadius)//跳过之前处理过的盘子{continue;}if (iRadius <= _iR && iRadius-iPreRadius >= iM)//满足条件则试取出这个盘子{iRet = DoFind(_iR+1, _iH-1, i, clDisks);if (iRet >= iResult)//记录这次循环中的最大结果{iResult = iRet + 1;}}}return iResult;
}DISKS_CL::DISKS_CL(int _iN)
{iN = _iN;piRadius = new int[iN];Input();
}
DISKS_CL::~DISKS_CL()
{if (NULL != piRadius){delete piRadius;}return;
}
DISKS_CL::DISKS_CL(const DISKS_CL& _clDisks)
{int i;iN = _clDisks.GetDiskNum();piRadius = new int[iN];for (i=0; i<iN; i++){piRadius[i] = _clDisks.GetDiskByIndex(i);}return;
}
DISKS_CL& DISKS_CL::operator=(const DISKS_CL& _clDisks)
{int i;iN = _clDisks.GetDiskNum();piRadius = new int[iN];for (i=0; i<iN; i++){piRadius[i] = _clDisks.GetDiskByIndex(i);}return *this;
}int DISKS_CL::GetDiskByIndex(int iIndex) const
{return piRadius[iIndex];
}
void DISKS_CL::DeleteDiskByIndex(int iIndex)
{piRadius[iIndex]=0;return;
}
int DISKS_CL::GetDiskNum() const
{return iN;
}void DISKS_CL::Input()
{int i;for (i=0;i<iN;i++){cin>>piRadius[i];}return;
}int main()
{int iNum;STORAGE_CL clStorage;DISKS_CL clDisks(clStorage.GetDiskNum());iNum = clStorage.FindMax(clDisks);cout<<iNum<<endl;return 0;
}

运行结果:

hc@ubuntu:~/Workspace/ms_proj/src$ ./run_disk_storage 
5 1 10 3
1 3 4 5 10
4
hc@ubuntu:~/Workspace/ms_proj/src$ ./run_disk_storage 
6 2 10 3 
1 2 3 4 5 6  
3

微软苏州校招1月3日在线编程题2——Disk Storage相关推荐

  1. 微软苏州校招1月3日在线编程题1——constellations

    题目1 : Constellations 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 Recently Little Hi started to like astro ...

  2. 微软2023校招8月26日即将截止!没有完成投递的小伙伴抓紧啦!

    微软2023校招8月26日截止,还没找到内推的23届同学可以发邮件到592786579@qq.com 网申时间:2022 / 8 / 1 - 2022 / 8 / 26 官网投递链接: https:/ ...

  3. 完美世界校招在线笔试题-互联网Java(11月1日)编程题

    一.题目 考试题目数为n,每道题只有做和不做.每道题都有不同难度,且每道题都各自分值及完成所需时间.现在计算在给定的时间m内,做题的最大得分. 输入: 第一行 :n 代表题目数 第二行:n个题目,每道 ...

  4. 11月11日在线研讨会预热 | ODX诊断数据库转换工具 — VDC(ODX)

    11月11日在线研讨会预热 | ODX诊断数据库转换工具 - VDC(ODX) 概述 INTEWORK-VDC(ODX)(Vehicle Database Convertor) 是将恒润诊断调查问卷转 ...

  5. 9月13号魔兽服务器维护,魔兽世界9月13日在线修正 魔兽世界9月13日更新了什么...

    魔兽世界9月13日在线修正.主要是死亡骑士改动,艾泽拉斯之心调整,另外修复了史诗纯净圣母的BUG,下面就一起来看看魔兽世界9月13日更新了什么吧. 职业 死亡骑士 邪恶 最后的惊喜不再获得两次精通:恐 ...

  6. 微软将在 6 月 24 日的活动中推出重新设计的 Windows 10

    Windows 10 重新设计 一项重大的 Windows 10 重新设计正在进行中,微软用户将在本月一睹"下一代 Windows"的风采. 微软将在6月24日推出其主要的Wind ...

  7. 服务器临时维护 开启另行通知,倩女幽魂手游6月23日在线维护公告内容介绍

    为了玩家更好的游戏体验,本周起将通过在线维护的方式投放每周更新内容.如特殊情况需停服维护(包括但不限于合服.月度版本更新.服务器临时维护等),将另行公告通知.祝全体玩家游戏愉快! 本周在线更新内容如下 ...

  8. 9月2日在线研讨会 | 基于TESSY的测试用例自动化评估与优化

    9月2日在线研讨会 | 基于TESSY的测试用例自动化评估与优化 针对软件白盒测试,ISO26262标准的Part 6部分给出了具体要求说明,包括测试的前提条件.推荐测试方法.工作产品等,随着各大整车 ...

  9. 王者服务器维护结束2020331,S19荣耀进阶战令的星元部件是哪一位英雄的 王者荣耀2020年3月31日每日一题答案 - 找游戏手游网...

    版本:v1.52.1.37 类型:MOBA跑酷大小:1.98 GB评分:9.2 标签: moba 腾讯游戏 塔防 竞技游戏 角色扮演 联机对战 立即下载 S19荣耀进阶战令的星元部件是哪一位英雄的?这 ...

  10. 【使用switch语句】 用C语言编程实现输入年、月、日,编程求这一日是该年中的第几天。

    问题:实现输入年.月.日,编程求这一日是该年中的第几天. 分析,解决: 1.首先定义年,月,日 2.输入年月日(注意scanf里有逗号),switch语句中的意思是看你输入几月份,然后再按照几日进行加 ...

最新文章

  1. JDK动态代理小例子
  2. MySQL在创建相同表结构时as和like 使用的区别
  3. python基础教程:python中@的用法
  4. python线程监控_Python实现线程状态监测简单示例
  5. 图的单源最短路径(Dijkstra算法)
  6. 华为机考题 004字符串分割
  7. cannot be null mysql_mysql5.7 column cannot be null-阿里云开发者社区
  8. JAVA→JDBCJava DataBase Connectivity、存储过程Stored Procedure、事务Transaction、连接池DBCP C3P0、JDBC升级替代框架
  9. 连载四:PyCon2018|恶意域名检测实例(附源码)
  10. .obj格式的文件怎么显示在html_怎么才能把安卓手机备忘录便签里的文件转到苹果上?...
  11. SaltStack 学习笔记 - 第十二篇: SaltStack Web 界面
  12. 计算机专业毕业设计的进度记录,毕业设计周次进度计划及实际进展情况表.doc...
  13. Lu窗口库LuWin
  14. SpringBoot 整合 Editormd(完整版)
  15. 基于深度学习的商品检索技术
  16. 编译Linux内核4.4实现可读NTFS
  17. 安卓开发——升级compileSdkVersion、targetSdkVersion、buildToolsVersion、support包到最新(28)问题解决
  18. BootStrap Table的JS封装
  19. [RPI]关于树莓派3B+的AV接口(RCV)
  20. 3Dmax Script 自动减面

热门文章

  1. OpenCV:旋转矩形(RotatedRect)
  2. Java技术未来十年发展
  3. 论文投稿排版时,Word首页插入连续分节符,后面的内容自动到下一页
  4. 自己DIY一个mp3播放器
  5. 规则三度体磁力异常 matlab,三维强磁性体的勘探方法及勘探系统与流程
  6. mis服务器系统,MIS系统中服务器推技术的实现
  7. 2023东北大学计算机考研信息汇总
  8. 两台电脑串口通信实现文件传输
  9. 微博营销的优劣势。如何利用微博开展营销。
  10. 解决通过雪花算法生成的id前端接受数据精度丢失问题