这两张魔法卡的最高技能是什么
What is the maximum skill that these 2 magic cards can play?
我正试图用C/C++编写一个程序来解决下面的问题,我想知道我们能用treap来处理它吗?
描述
有2n张魔法卡,每张魔法卡有两个正整数a和b。将这些魔法卡分成2堆,每堆n张。一堆魔法卡所能打出的技能值是堆中最小a和最小b的乘积。你有一种超能力,可以交换魔法卡上的a和b值,并无限期地使用这种能力。你想知道如何将魔法卡分成2堆(你可以使用超能力(。这两张魔法卡的最高技能是什么?
输入
第一个行为是一个正整数n,表示有2n张魔术卡;
接下来的2n行,每行由两个正整数ai、bi组成,表示每个魔术卡上的两个值;
对于60%的数据=n<10^3;
对于100%的数据,1<n<10^5,1<ai、bi<10^9.
输出
输出一个表示最大技能值的正整数。
样本输入
2 1 2 3 4 5 6 7 8
样本输出
32
样本输出意味着1*2+5*6=32
此测试数据由我自己制作:
输入:
3
8 1
2 7
5 4
2 6
4 6
5 3
输出:
17
输出意味着1*5+2*6=17
我将使用结构来实现这一点,让我们看看OJ明天会给出什么结果(可能是TLE(。
以下是问题提示中的一些想法,首先使用超能力将所有卡转换为a<b
,按从小到大的值排序。
最小的a固定在第一堆中,并从a的第二小值开始枚举。假设枚举到a[i],则将i之后的所有卡(包括i(放入第二堆,并将i之前的所有卡放入第一堆。
此时,我们需要从第二个堆中选择n-i+1放入第一个堆中。选择的策略如下:
- 根据b值从小到大对第二个堆的所有卡片进行排序,然后为第一个堆选择第一个n-i+1或下一个n-i+1
事实上,这是为了找到第一个最小b值或n-i+1个大b值的卡。这个过程是用treap来维护的,并且总的时间复杂度是O(nlogn(。
相关文章:
- 为不同配置设置MSVC_RUNTIME_LIBRARY的正确方法是什么
- C++避免重复声明的语法是什么
- 在C++中,将大的无符号浮点数四舍五入为整数的最佳方法是什么
- 实现无开销push_back的最佳方法是什么
- C++从另一个类访问公共静态向量的正确方法是什么
- "throw expression code" 1e7 >返回 d 是什么?投掷标准::overflow_error( "too big" ) : d;意味 着?
- C++中名称篡改的目的是什么
- 在 c++ 中拥有一组结构的正确方法是什么?
- 这个指针和内存代码打印是什么?我不知道是打印垃圾还是如何打印我需要的值
- 是什么阻止DOMTimerCoordinator::NextID进入无休止的循环
- 派生类销毁的最佳实践是什么
- 高完整性C++规则7.2.1的基本原理是什么
- 这两张魔法卡的最高技能是什么
- 在高通六边形处理器的word32上执行水平求和的最快方法是什么
- 在Qt5中缩放高DPI图像的最佳方法是什么?
- MFC 用于计算控件的高光、阴影等的算法或函数是什么?
- Mac 上高带宽数据流最有效的进程间通信方法是什么?
- 是什么阻止了用户空间程序切换到更高级别
- CPU使用率高的常见原因是什么
- C++中的人工智能应用:虚拟功能的成本有多高?可能的优化是什么