【二分】Distinct

博客围绕战棋游戏展开,Daniel有n队士兵在x轴,每队有不同人数和坐标,他想让士兵移动使无两人在同一位置,且每个士兵移动距离最大值最小。介绍了输入输出格式及样例,给出用二分法、让每个士兵尽量靠左的解题思路。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目描述

Daniel 正在玩一个战棋游戏。
现在 Daniel 有 n 队士兵站在 x 轴上。第 i 队士兵有 ai 人,坐标为 xi。
Daniel 看到一队士兵有这么多人,都站在同一个位置,他对此很不满意。他
想命令一些士兵移动到新的位置(必须是整点),使得不存在两个士兵站在同一个
位置。
为了节约时间,Daniel 希望每个士兵的移动距离的最大值尽可能小。请求出
这个最小值。

输入

第一行一个正整数 n,表示 Daniel 有多少队士兵。第二行 n 个正整数 ai,表示每队士兵的人数。第三行 n 个严格递增的 整数 xi,表示每队士兵的坐标。

输出

一行一个非负整数,表示每个士兵的移动距离的最大值的最小值

输入样例
2
2 3
0 2
输出样例
1

说明

样例解释
移动后,5 个士兵的坐标分别为 -1, 0, 1, 2, 3。
有 2 个士兵移动距离为 0,3 个士兵移动距离为 1,因此答案是1

思路

用二分,每一个士兵尽量靠左

#include<Algorithm>
#include<Iostream>
#include<Cstring>
#include<Cstdio>
#include<Cmath>
#define ll long long
using namespace std;
ll A[100250],F[100250];
ll n,m;
bool Check(ll K)
{
	m=F[1]-K+A[1];//最少移动K步且靠最左
	for(ll i=2;i<=n;++i)
	{
		if(m-1>F[i-1]+K)return 0;//判断是否超过K
		m=max(m,F[i]-K)+A[i];//
	}
	if(m-1>F[n]+K)return 0;
	else return 1;
}
int main()
{
//	freopen("1.txt","r",stdin);
	scanf("%lld",&n) ;
	ll l=0,r=0;
	for(ll i=1;i<=n;++i)
	{
		scanf("%lld",&A[i]);
		l=max(A[i],l);
		r+=A[i];
	}
	for(ll i=1;i<=n;++i)scanf("%lld",&F[i]);
	l/=2;
	while(l<=r)//二分
	{
		ll mid=(l+r)/2;
		if(Check(mid))r=mid-1;
		else l=mid+1;
	}
	printf("%lld",l);
	return 0;
}
<think>嗯,用户想了解MySQL中DISTINCT关键字的用法。首先,我需要回忆一下DISTINCT的基本作用。DISTINCT主要用于去除查询结果中的重复行,返回唯一不同的值。接下来,我应该分几个部分来讲解,比如基本语法、单列去重、多列组合去重、与聚合函数结合使用,还有与其他子句如LIMIT、ORDERBY的配合。根据用户提供的引用内容,他们可能已经看过一些例子,比如在SELECT语句中使用DISTINCT,或者在JOIN和子查询中的应用。我需要确保覆盖这些方面,并且提供具体的示例,这样用户更容易理解。比如,引用[1]中提到DISTINCT与LIMIT的结合,引用[2]提到了ORDERBY的使用,而引用[3]给出了一个表的创建和数据插入的例子,这可能用来演示DISTINCT的效果。 用户可能还想知道DISTINCT的注意事项,比如它在处理NULL值时的行为,或者性能方面的考虑。比如,当DISTINCT用于多列时,如何判断行的唯一性,以及使用DISTINCT可能带来的性能影响,尤其是在大数据量的情况下。另外,用户的问题可能涉及到DISTINCT的高级用法,比如在子查询中使用,或者与其他关键字如GROUPBY的区别。需要比较DISTINCT和GROUPBY的不同,指出它们各自的适用场景,比如DISTINCT更适用于简单的去重,而GROUP BY适合在分组后进行聚合计算。还要考虑用户可能的误区,比如DISTINCT是否会影响所有列,或者是否可以和COUNT一起使用。例如,COUNT(DISTINCTcolumn)是一个常见的用法,用来计算唯一值的数量,这需要特别说明。最后,生成相关问题的时候,要围绕用户可能的后续疑问,比如优化DISTINCT查询的方法,或者与其他关键字的比较,确保问题能够引导用户进一步深入学习。</think>### MySQL DISTINCT 关键字使用教程 #### 一、基本语法与单列去重 `DISTINCT` 关键字用于消除查询结果中**重复的行**,语法为: ```sql SELECT DISTINCT column_name FROM table_name; ``` 示例:查询 `employee_info` 表中所有唯一的性别类型: ```sql SELECT DISTINCT gender FROM employee_info; ``` 输出结果会显示 `male` 和 `female`(无重复)[^3]。 #### 二、多列组合去重 当对多个列使用 `DISTINCT` 时,MySQL 会根据**所有列的值的组合**判断唯一性: ```sql SELECT DISTINCT age, salary FROM employee_info; ``` 此查询会返回 `(28,8000)`、`(25,6000)` 等唯一组合[^3]。 #### 三、与聚合函数结合 1. **统计唯一值数量**: ```sql SELECT COUNT(DISTINCT gender) FROM employee_info; -- 结果为2 ``` 2. **与 SUM/AVG 结合**: ```sql SELECT AVG(DISTINCT salary) FROM employee_info; ``` #### 四、与其他子句配合 1. **与 `LIMIT` 结合**(引用[1]): ```sql SELECT DISTINCT city FROM customers LIMIT 10; ``` 2. **与 `ORDER BY` 结合**(引用[2]): ```sql SELECT DISTINCT from_bank_code FROM sys_cross_bank_setting WHERE type = 1 ORDER BY sort; ``` #### 五、高级用法 1. **在 `JOIN` 查询中**(引用[1]): ```sql SELECT DISTINCT customers.name FROM customers JOIN orders ON customers.id = orders.customer_id; ``` 2. **在子查询中**(引用[1]): ```sql SELECT * FROM products WHERE category_id IN ( SELECT DISTINCT category_id FROM special_categories ); ``` #### 六、注意事项 1. **`NULL` 值处理**:`DISTINCT` 会将所有 `NULL` 视为相同值,仅保留一个。 2. **性能影响**:对大数据表使用 `DISTINCT` 可能导致全表扫描,可通过索引优化。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值