1 条题解

  • 0
    @ 2025-8-24 23:15:42

    自动搬运

    查看原文

    来自洛谷,原作者为

    avatar TemplateClass
    **

    搬运于2025-08-24 23:15:42,当前版本为作者最后更新于2025-05-09 20:47:11,作者可能在搬运后再次修改,您可在原文处查看最新版

    自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多

    以下是正文


    设 Alice、Bob 依次选了口味 aa、蛋筒 bb 和配料 cc,那么此时得分是 a+b+cP|a + b + c - P|。所以对于给定的 aabb,最终的得分取决于 cc 的选择。因为 Alice 最后选,她会选 cc 中使得得分最大的那个。那对于 Bob 来说,选 bb 的时候要考虑到,不管自己怎么选,Alice 都会在选 cc 时最大化得分。所以 Bob 要选一个使得这个最大可能的得分最小的 bb

    首先我们分析最后选 cc 的那一步,显然 Alice 希望总和尽可能地远离 PP,不难发现只有 c=min{C}c = \min\{C\}c=max{C}c = \max\{C\} 时有可能取到最值,也就是说对于给定的 a,ba, b,最终的得分就是

    $$\max(|a + b + \min\{C\} - P|, |a + b + \max\{C\} - P|) $$

    现在,Bob 在选 bb 的时候,面对一个固定的 aa,他的目标是选择一个 bb,使得这个式子尽可能小。利用绝对值的几何含义,显然如果希望这两个式子的最大值最小,两边的 a+b+min{C}a + b + \min\{C\}a+b+max{C}a + b + \max\{C\} 要尽可能对称地分布在 PP 的两侧,也就是说

    $$b = -\frac{1}{2}[(a + \min\{C\} - P) + (a + \max\{C\} - P)] $$

    也就是

    b=Pa12(min{C}+max{C})b = P - a - \frac{1}{2}(\min\{C\} + \max\{C\})

    于是我们先对 BB 进行排序,然后枚举 aa,对于每个 aa,二分得到 BB 中离上式最近的值,然后更新一下即可,时间复杂度 O((X+Y)logY)O((X + Y) \log Y)

    #include<iostream>
    #include<algorithm>
    
    constexpr int N = 2e5 + 5;
    int x, y, z, p, a[N], b[N], c[N], max = -1;
    
    int main(){
    	std::ios::sync_with_stdio(false);
    	std::cin.tie(0), std::cout.tie(0);
    	
    	std::cin >> x >> y >> z >> p;
    	for(int i = 1; i <= x; ++i) std::cin >> a[i];
    	for(int i = 1; i <= y; ++i) std::cin >> b[i];
    	for(int i = 1; i <= z; ++i) std::cin >> c[i];
    	int cmin = *std::min_element(c + 1, c + z + 1);
    	int cmax = *std::max_element(c + 1, c + z + 1);
    	std::sort(b + 1, b + y + 1);
    	for(int i = 1; i <= x; ++i) {
    		double bp = p - (cmin + cmax) / 2. - a[i]; int c;
    		int P = std::lower_bound(b + 1, b + y + 1, bp) - b;
    		if(P == 1) c = b[1]; else if(P == y + 1) c = b[y];
            else c = (b[P] - bp < bp - b[P - 1] ? b[P] : b[P - 1]);
    		int s1 = std::abs(a[i] + c + cmin - p);
    		int s2 = std::abs(a[i] + c + cmax - p);
    		max = std::max(max, std::max(s1, s2));
    	}
    	std::cout << max << "\n";
    	
    	return 0;
    }
    
    • 1

    信息

    ID
    11741
    时间
    2000ms
    内存
    1000MiB
    难度
    4
    标签
    递交数
    0
    已通过
    0
    上传者