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) 的所有排列,求使排列中每两个相邻元素的数值差的绝对值的和的最大值。即求最大化 (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 longprintf 参数的类型问题。


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 国际许可协议 保护。
原文地址:https://www.cnblogs.com/greyqz/p/9833944.html