Contention

Google Kickstart 2019 Round A : Contention

问题

你正在给一个电影院售卖前排座位。假设前排座位有N个座位,从左到右编号1到N。你上个星期不在办公室,而现在回到办公室后发现桌子上已经堆积了Q个购票请求,假设第i个购票请求是购买从LiNi(含端点)的所有座位。你现在不得不把这些请求一个个输入到系统中进行座位分配。
由于这些购票请求的座位可能重叠,系统无法完全满足所有的购票请求。当你把一个购票请求输入到系统中时,系统会把该请求想预订的且当前未出售的座位全部分配给该请求。
求解最大的k,使得存在一种输入购票请求的顺序,在系统处理完所有的请求后,每个请求都至少获得了k个座位。
输入
第一行为一个数字T,代表有T个测试用例。
接下来是T个测试,每个测试用例的首行是NQ,代表有N个座位和Q个购票请求。后面接着Q个购票请求的最左端和最右端座位的编号LiRi
输出
对每一个测试用例,输出上面所述的k
限制
1 ≤ L ≤ R ≤ N ≤ 106
1 ≤ Q ≤ 30000

初步思想(官方解析):

The number of possible orderings of the requests is Factorial(Q), which would not be fast enough for either of the test sets. We can observe that for a chosen ordering of the requests, the number of seats that the system books in the last request does not depend on the ordering of the previous Q - 1 requests. So, we could start by finding the request to be processed last and move backwards towards the earlier requests. The answer is the minimum seats booked across the Q steps.
Another observation is that at every step, we can always choose this last request greedily from the remaining set: the one where we can book the maximum number of seats. An intuitive proof of why this works would be noticing that our final answer is non-increasing over the Q steps. Now, we can use exchange argument to prove this observation since choosing a request with lesser seats booked would not give us a better answer.

基于如下观察:当我们给第Q个请求分配座位时,前面的Q-1个请求已经分配完毕。因此第Q个请求的座位分配与前面Q-1请求的 顺序 无关。因此我们可以从确定输入系统的最后一个请求开始往前推,每次确定一个请求,这个请求相比其他未确定的请求能够获得更多的座位,直到确定出第一个请求。为什么这样贪心的做法能够得到最优解?原因在于这样的过程中,k是非递增的。假使现在我们要确定倒数第Q-m个请求,按照贪心的思想确定的请求是 Qu,而最优的方案此时应该选择Qv,使用A(Qu)A(Qv)来指代这两个请求在当前位置输入购票系统能够获得的座位数,那么应有 A(Qu) > A(Qv)。若选择Qv,那么就有k <= A(Qv),然而贪心的方法在选择了Qu之后或许存在一种顺序使得还未确定下的m个请求所能获得的最小座位数比A(Qv)大,这也就说明当下选择Qv并不是必要的,因为它不必要地降低了我们所求的k值。
更直观一点就是,如果把请求Qu放到第Q-m个位置就能获得A(Qu)个座位,现在把这个请求更早地输入系统中,所能获得的座位必定相等或更多,然而这并没有提高我们的座位分配数下界。而若我们把请求Qv放在第Q-m个位置,则是鲁莽地刷新了座位分配数的下界,这个下界后续无论怎么优化请求的顺序都无法再提高。
再来考虑如果此时有多个未确定请求,他们若在此位置输入系统都可获得A(Qv)个座位,那么该在他们之间如何选择?如果他们都能获得A(Qv)个座位,说明他们与除他们自己外的其他请求相比都有A(Qv)个不同的座位想预订,那么这时谁先谁后都不会对k造成影响,因为这几个请求必定能获得等于或大于A(Qv)个座位!

具体实现待续。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值