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) 的所有排列,求使排列中每两个相邻元素的数值差的绝对值的和的最大值。即求最大化 (sumlimits_{i=1}^{N-1}lvert a_i-a_{i+1} vert)。
我们考虑 (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+displaystylefrac{N(N-4)}{2})。
同理,当 (N) 为奇数时,和的最大值为 (2(2+4+6+cdots+N-3)+(N-2)+(N-1)=2N-3+displaystylefrac{(N-1)(N-3)}{2})。
特别地,当 (N=1) 时,最大值为 (0) 而不是 (-1)。(坑点)
综上。
注意开 long long
时 printf
参数的类型问题。