首页 > 其他分享 >CF594A Warrior and Archer 题解

CF594A Warrior and Archer 题解

时间:2023-04-02 10:12:50浏览次数:38  
标签:Warrior frac 个点 int 题解 位置 距离 CF594A 两点

由于本人在思索了很久后才把本题思路打通,所以为了帮助像我一样没有非常理解解法的人,我打算再将解法非常详细地叙述一遍,如果您无法理解解法,请跟着我再一步步将题目捋顺。

Step.1 解题意

题目要求其实很好理解,共给出 \(n\) 个点的位置,A,B两个人轮流取点,A要求最后剩下的两个点尽量近,B要求最后剩下的两个点尽量远。

Step.2 推一推

在这过程中,有一些东西可以被推知,这里做出详细的解释(由于解释太过于精细,dalao们请自行忽视):

  1. 一共有几个点?显然 \(n\) 个

  2. 最后剩下几个点?显然 \(2\) 个

  3. 综合 \(1,2\),可知两人一共取走了 \(n-2\) 个点

  4. 显然,两人取走的点是一样多的。也就是说,由于他们一共取走 \(n-2\) 个点,因此 \(A\) 和 \(B\) 两人分别取走了 \(\frac{n-2}{2}\) 个点。而学过小学数学的人都知道:

\[\frac{n-2}{2}=\frac{n}{2}-\frac{2}{2}=\frac{n}{2}-1 \]

所以,两人分别取走了 \(\frac{n}{2}-1\)个点

5.\(A\) 会取哪些点?\(B\) 会取哪些点?这是理解本题的关键。首先有两个点能使A,B两人的收益同时最大(这不废话吗),但这两个点是固定的,即当数据给出时便已经确定。所以A为了使两点距离尽量近,会选择取走两点左右的点,更具体说,他会选择去掉端点位置的点。而B要使两点距离尽量远,会选择去掉两点中间位置的点。这里要注意的是,由于这两个点同时保证了A,B两人的利益最大化,所以两人都不会选择去掉这个点。

  1. 如何确定两点位置?这是构造代码的核心。这其实很好理解。尤其是我们已经得出了上面的结论。由于B只会取两点之间的点且B取了 \(\frac{n}{2}-1\) 个点(前文已推知),因此最后剩下两点之间的距离为 \((\frac{n}{2}-1)+1=\frac{n}{2}\),即两点间距离等于点数加一,详情可以参照小学奥数:植树问题。(注意这里假设每个点间距离为 \(1\))。设较近的点距离为 \(k\),则较远的点距离为 \(k+\frac{n}{2}\)。

Step.3 码一码(构造代码)

我们知道了剩余两个点的位置关系,就可以通过枚举第一个点的位置,得到第二个点的位置,得到两点间的距离。那如何确定当前枚举的情况是好的呢?由于A先取,具有先手优势,于是我们应当取两个点之间的距离最小值。
需要注意的一点是,在枚举之前,由于输入的序列没有单调性,于是我们应先将其排序。

代码如下:

#include <bits/stdc++.h>

#define endl '\n'

using namespace std;

const int N = 2e5 + 5;

int n;
int a[N];

int ans = (1 << 30);

signed main() {
	
	ios::sync_with_stdio(false);
	cin.tie(0); cout.tie(0);
	
	cin >> n;
	for(int i = 1; i <= n; i ++) {
		cin >> a[i];
	}
	
	sort(a + 1, a + n + 1);
	
	for(int i = 1; i <= (n >> 1); i ++) {
		ans = min(a[i + (n >> 1)] - a[i], ans);
	}
	
	cout << ans << endl;
	
	return 0;
}

这里对位运算作出解释:\((n>>1)\) 代表 \(n\) 二进制右移一位,等价于 \(n\over 2\)
写的这么认真,还不点赞吗?
求过QWQ

标签:Warrior,frac,个点,int,题解,位置,距离,CF594A,两点
From: https://www.cnblogs.com/ZyIOLO/p/17279968.html

相关文章

  • 洛谷 P8918 『MdOI R5』Jump 题解
    题目传送门这一题其实很简单,只是要想到正确方法我一开始用了奇怪的搜索①无解的情况:看上去很离奇,实际上略加思索就会发现,如果输入\(n\)为偶数,那么就铁定无解。证明过程如下:令\(n\bmod{2}=0\),人距离\(n\)点的距离为\(dis\),则当走出第一步(步长为\(1\))时,有:\[dis=\midn......
  • 洛谷 P9009 [入门赛 #9] 牵连的世界 (Hard Version) 题解
    P9009[入门赛#9],真9。这是一道hack题,即你需要自造符合题意的数据使题中所给程序无法AC。Task01看数据范围知一切,显然有\(-2\times10^9\lea_i\le2\times10^9\),因此\(a_i\)可能为负数。注意C/C++中的取模%(mod)运算实质上是为取余运算(rem)对于整型数a,b来说......
  • 洛谷 P8762 [蓝桥杯 2021 国 ABC] 123 题解
    为什么可以使用前缀和,这里提供解释:初读题目,我们发现这个数列很迷惑,似乎不能使用数学方法来解。\[1,1,2,1,2,3,1,2,3,4,\cdots\]但是,我们可以想到数形结合的方式,我们将数列看作一个三角形,于是他变成了:\[1\]\[1,2\]\[1,2,3\]\[1,2,3,4\]\[\cdots\cdots\]于是本题变得好思......
  • SP181 SCUBADIV - Scuba diver 题解
    题目传送门题目大意潜水员有\(n\)个气缸,每个气缸能够提供容量为\(o_i\)的氧气和容量为\(d_i\)的氮气,每个气缸的重量为\(w_i\)。给出潜水员所需要的氧气量和氮气量,求所需气缸的总重的最低限度是多少。解题思路对于每个气缸,有两种不同的费用:氧气和氮气,需要满足这两个条......
  • 一篇关于异或操作的题解 (来源:杭电oj: find your present (2))
    害惭愧惭愧老长时间没写代码了——————————转回正题,对于杭电这个题先说我超时的错误想法—————————————————————————————————————————————————————————————— 一开始我的想法是开一个大小为100000......
  • [省选联考 2023]D1 题解
    D1T1P9166火车站观察题目,联系到以前做过的一些区间dp可以发现如果小A可以去到(这里是去到而不是最终停在)\(k\)地点,那么\(x\)到\(k\)之间的所有地点他都可以去到,因为火车是连续的,不能跳着走,要来到当前地点必须到过路途中的所有节点。这样子就好办了,分两次处理往左边和......
  • P6146 [USACO20FEB]Help Yourself G 题解
    题目链接先按左端点从小到大排序。设\(f(i)\)表示前\(i\)条线段的所有子集的复杂度之和。考虑从\(f(i-1)\)转移到\(f(i)\),即考虑新加进来第\(i\)条线段的过程。第\(i\)条线段加进来所新产生的贡献分两种:设除了第\(i\)条线段选中的线段集合为\(S\),则若\(S\)......
  • # P4391 [BOI2009]Radio Transmission 无线传输 题解
    [BOI2009]RadioTransmission无线传输题目描述给你一个字符串\(s_1\),它是由某个字符串\(s_2\)不断自我连接形成的(保证至少重复\(2\)次)。但是字符串\(s_2\)是不确定的,现在只想知道它的最短长度是多少。输入格式第一行一个整数\(L\),表示给出字符串的长度。第二行给出......
  • 4.1 模拟赛题解
    A一模一样讲过B先做一遍前缀和将区间和转成两数之差的形式。cdq分治,递归时排好序。按顺序枚举左端点,合法的右端点区间单调移动。CIDA*,容易发现每次翻转并不会打乱中间的铁盘,只会改变下边界的相邻关系。最终顺序相邻两个铁盘大小相差均为\(1\),所以估价函数设为已操作次数......
  • 使用 IntelliJ IDEA 构建 Spring Framework 5.3.21 源码问题解决
    源码版本1、下载地址:https://github.com/spring-projects/spring-framework/tags2、选择要构建的源码版本并下载,例如:5.3.21相关环境1、操作系统:Windows102、JDK版本:Jdk173、IDE工具:IntelliJIDEA2021.3.34、项目构建工具:Gradle7.3.3使用IntelliJIDEA构建Spring......