洛谷T779231 模拟赛2 T3 木雕玩具(toy)

T779231 模拟赛2 T3 木雕玩具(toy)

题目描述

在一个小镇上,有一个专门从事木雕工艺的工作室。由于小镇规模不大,只有三位雕刻师在那里工作。

小镇上计划举办一个木制玩具节。工作室的员工们想要为此做好准备。

将会有 \(n\) 个人来到工作室请求制作木制玩具。每个人都是独一无二的,他们可能想要不同的玩具。为了简化问题,让我们用 \(a_i\) 表示第 \(i\) 个人想要的玩具图案。

每位雕刻师都可以事先选择一个图案,用一个 \(1\)\(10^9\) 之间的整数 \(x\) 来表示,不同的雕刻师可以选择不同的图案。在节日准备期间,雕刻师将完全掌握制作所选图案玩具的技巧,这将使他们能够立刻切割出木制玩具。对于选择了图案 \(x\) 的雕刻师来说,制作图案为 \(y\) 的玩具将需要 \(|x-y|\) 的时间,因为玩具图案越接近他能立即制作的,雕刻师就越能快速完成工作。

在节日当天,当一个人来到工作室请求制作木制玩具时,雕刻师可以选择谁来接手这份工作。同时,雕刻师们都是非常熟练的人,可以同时为不同的人工作。

由于人们不喜欢等待,雕刻师们希望选择准备的图案,使得所有人的最大等待时间尽可能小,请你求出这个值。

输入格式

第一行包含一个整数 \(n\) 表示来到工作室的人数。

第二行包含 \(n\) 个整数 \(a_{1\sim n}\) 表示玩具的图案。

输出格式

一行一个整数表示答案。

输入输出样例 #1

输入 #1

6
1 7 7 9 9 9

输出 #1

0

输入输出样例 #2

输入 #2

6
5 4 2 1 30 60

输出 #2

2

输入输出样例 #3

输入 #3

9
14 19 37 59 1 4 4 98 73

输出 #3

13

说明/提示

样例 1 解释

三位雕刻师事先选择图案 \(1,7,9\)

样例 2 解释

三位雕刻师事先选择图案 \(3,30,60\)

样例 3 解释

三位雕刻师事先选择图案 \(14,50,85\)

数据规模与约定

对于 \(30\%\) 的数据,\(1\leq n\leq 10\)\(1\leq a_i\leq 100\)

对于 \(50\%\) 的数据,\(1\leq n\leq 2000\)\(1\leq a_i\leq 100\)

对于 \(70\%\) 的数据,\(1\leq n\leq 2000\)

对于 \(100\%\) 的数据,\(1\leq n\leq 2\times 10^5\)\(1\leq a_i\leq 10^9\)

思路

这题其实就是让我们把原序列分成3个不重合的子序列
然后看到这是经典的最小值最大化->二分答案
先把数组排序
然后二分答案ans,l=0,r=a[n]-a[1]
判断函数check(mid):需要多少个区间,用cnt记录和判断

ACcode:

#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N=2e5+5;
int n;
ll a[N];
//判断d(区间为[s,s+2d],其实就是mid)是否可行
bool check(ll d){
	int cnt=0;
	int j=1;
	while(j<=n){
		cnt++;
		ll R=a[j]+2*d;
		while(j<=n and a[j]<=R) j++;
	}
	return cnt<=3;
}
int main(){
	ios::sync_with_stdio(0);
	cin.tie(0);
	cin>>n;
	for(int i=1;i<=n;i++) cin>>a[i];
	sort(a+1,a+n+1);
	ll l=0,r=a[n]-a[1],ans=r;
	while(l<=r){
		ll mid=(l+r)/2;
		if(check(mid)){
			ans=mid;
			r=mid-1;
		}else l=mid+1;
	}
	cout<<ans<<endl;
	return 0;
}
//Author:AAA_jiancaipifa
posted @ 2026-08-16 16:43  AAA_jiancaipifa  阅读(19)  评论(0)    收藏  举报