22 October in 614
Contest
A. defile
struct
自定义排序。按照题意抽象成模型模拟就可以了。
自定义排序核心代码:
struct node {
int x, id;
} d[1000003];
bool cmp1(const node& a, const node& b) {
return a.x < b.x;
}
bool cmp2(const node& a, const node& b) {
return a.id < b.id;
}
坑点:注意排序函数调用时参数问题。sort
的区间应该是 \([l,r)\),左闭右开。所以例如排序 a 到 b 之间的元素,应写作:
sort(d+a, d+b+1); // 包含 a,不包含 b+1
B. mute
贪心求最优解。思路类似于 [[雷达安装]]。
C. queue
给定正整数 \(N\),对于 \(N\) 的所有排列,求使排列中每两个相邻元素的数值差的绝对值的和的最大值。即求最大化 \(\sum\limits_{i=1}^{N-1}\lvert a_i-a_{i+1}\rvert\)。
我们考虑 \(N=10\) 的情况。为使答案尽可能大,我们应该尽量远离相差较小的两个数字,把相差较大的两个数字放在一起。
容易得出,数列 \(1,10,2,9,3,8,4,7,5,6\) 的答案为 \(45\),不是最优解。
我们在数列某处放入 \(10\)。显然,\(1\) 和 \(2\) 应该放在 \(10\) 的两侧,顺序任意。
而此时不应该立即填入 \(3,4\),而是填入 \(9,8\),以保证大小分布的均匀。
同理,填入 \(3,4,7,6,5\) 后数列如下:\(6,3,8,1,10,2,9,4,7,5\),答案为 \(49\)。
注意其中每两个数字的填入是随意的,左右填入相反不影响答案,但是为了计算方便,这里统一为左边填入较小的数字、右边填入较大的数字。\(5\) 作为独立的数字,放在最后面(比放在前面答案大)。
此时可作出差分数组 \(2,3,5,7,9,8,7,5,3\)。
观察可得,对于偶数 \(N\) 的排列,和的最大值为 \(2+2(3+5+7+\cdots+N-3)+(N-2)+(N-1)=2N-1+\displaystyle\frac{N(N-4)}{2}\)。
同理,当 \(N\) 为奇数时,和的最大值为 \(2(2+4+6+\cdots+N-3)+(N-2)+(N-1)=2N-3+\displaystyle\frac{(N-1)(N-3)}{2}\)。
特别地,当 \(N=1\) 时,最大值为 \(0\) 而不是 \(-1\)。(坑点)
综上。
注意开 long long
时 printf
参数的类型问题。
Post author 作者: Grey
Copyright Notice 版权说明: Except where otherwise noted, all content of this blog is licensed under a CC BY-NC-SA 4.0 International license. 除非另有说明,本博客上的所有文章均受 知识共享署名 - 非商业性使用 - 相同方式共享 4.0 国际许可协议 保护。