Genius ACM(倍增+归并优化)

Problem

【问题描述】
Advanced CPU Manufacturer (ACM) is one of the best CPU manufacturers in the world. 每天, 该公司生产n台CPU并销售到世界各地。

ACM公司的质检部门会对生产出的CPU进行成组测试,对一组(若干个)CPU进行测试的方法如下:

  1. 随机从该组CPU中选取m 对(即2m 台),若总数不足2m 台,则选取尽量多对。

  2. 对于每一对CPU,测量它们之间的Relative Performance Difference (RPD),并把第i 对的RPD记为Di。RPD的计算方法在后面给出。

  3. 该组CPU的Sqared Performance Difference (SPD) 由以下公式给出:

SPD=∑iD2i
SPD=∑iDi2
4) 该组CPU通过质检,当且仅当SPD≤k, 其中 k 是给定常数。

ACM公司生产的CPU性能很好,而质检部门制定的标准更是过于严格。通常他们把n 台CPU作为一整组进行测试,这导致一些性能良好的CPU无法通过测试,生产部门对此颇有微词。作为质检部门的领导,小S在不更改质检测试流程的前提下,想出了这样一个主意:如果能够把n 台CPU恰当地分成连续的若干段,使得每段CPU都能够通过成组测试,就可以解决当下的问题。

现在,小S已经知道了n台各自的性能表现P1…Pn,两台CPU的RPD被定义为它们性能表现的差的绝对值。请你帮忙计算一下,至少把这些CPU分成多少段,才能使得每一段都能通过成组测试。

【输入格式】
每个测试点包含多组数 据,第一行整T 给出数据组。

对于每组数 据,第一行三个整n m k,第二行 n 个整数P1…Pn。

【输出格式】
对于每组数据,输出一个整表示答案。

【样例输入】
2
5 1 49
8 2 1 7 9
5 1 64
8 2 1 7 9
【样例输出】
2
1

Solution

显然,这个东东肯定越长SPD值就越大,而且求SPD值的方法就是区间排序,首位不断相减,这样一定使得乘方和最大;而我们需要段尽可能的少,就需要每一段尽可能的长,因此我们的大体思路就是这样的:

  • 从头到尾开始扩展区间,能弄多长弄多长,然后分成一段;接下来从这一段的后面接着开始搞。

但是这一个东西应该怎么搞呢?我们可以使用倍增的思想开始搞,即:

  • 从起点开始,若可以扩展,就扩展;且标记下一次扩展的长度乘上2;若不能扩展,则标记下一次扩展的长度除以2,这样这一个扩展的时间复杂度是 O ( l o g   n ) O(log\ n) O(log n)的。
  • 然后我们需要判断这个区间是不是合法,我们最直观的思路是:给这个区间排序,然后暴力找;但是复杂度不够优秀。
  • 我们可以将那些已经确定的区间排序,新扩展的区间再排序,如果合法的话就用归并的思想合并一下;这样,时间复杂度就可以优化到 O ( n   l o g   n ) O(n\ log\ n) O(n log
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值