字节跳动2018校招前端方向(第三批)题目3

题意:现在有一排房间每个房间里有若干的人,现在会将某个房间i里的人重新分配,分配的方法是首先让i房间里的人都出来,之后按照i+1,i+2....的顺序每个房间分一个人,n号房间的下一个房间为1号房间,这样分配下去直到i房间里的所有人都重新分配。

现在给你最后房间的人数状态和最后一个人被分配到的房间号,要求你输出原来每个房间里有多少人

 

思路:真的是太久没做过题了完全懵逼。。。。。。。

           最笨的方法是模拟,从最后那个人被分配到房间开始往前每个房间人数减一倒推状态,直到减到某个房间人数为0没法减了那么这个房间就是被重新分配的房间。当然模拟肯定会超时。

          首先我们的目的是找回最初的状态,那么任务就是要找出被重新分配的房间是哪一间。

         那么一分析就会发现被重新分配的房间必然是人数最少的

      【因为首先重新分配前会把房间人数清零,且按照他的方法重新分配房间i是每轮最后分到人的所以分配到的人数也必然不会比其他房间多】

         但是会存在有多个房间的人数都为最少的,这时候怎么确认哪间才是被重新分配的?

         这时候考虑模拟的方法就会得到结论:离最后那个人被分配的房间左边最近的那间房间就是被分配的房间

 

       这样我们就可以大幅减少模拟

       首先找出被重新分配的房间的号码和人数【这个人数就为一共循环分配了几轮】

       之后把所有的房间人数-循环分配的轮数,然后从最后一个人被分配的房间向左模拟最后一轮没够所有房间的分配情况

      被分配房间原本的人数就为 分配后房i的人数*房间总数+离最后被分配人的房间左侧的距离

 

代码等明早起来再写了

15号就机试了我也要加把劲骑士

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值