打卡信奥刷题(1939)用C++实现信奥 P10205 [JOI 2024 Final] 室温 / Room Temperature
题目要求确定一个整数温度x,使得所有高管在最优选择外套数量后的不舒适度最大值最小化。每位高管的舒适温度会随外套数量k变化,满足Ai-kT。通过分析发现,最优解与Ai模T后的分布有关:将Ai对T取模排序后,最大间隙决定了不舒适度的最小值。解法是对Ai取模排序,计算最大相邻间隙,最终答案为⌈(T-最大间隙)/2⌉。时间复杂度为O(N log N)。样例验证了该方法的正确性。
P10205 [JOI 2024 Final] 室温 / Room Temperature
题目描述
K 董事长负责调节高管们的房间的室温,他希望高管们能尽可能舒适地工作。
现在房间里有 NNN 位高管。每位高管都有一个从 111 到 NNN 的编号。不穿外套时,高管 i (1≤i≤N)i\ (1 \leq i \leq N)i (1≤i≤N) 的舒适温度是 AiA_{i}Ai 度。另外,每位高管每穿一件外套,舒适温度就会降低 TTT 度。也就是说,高管 iii 如果穿了 kkk 件外套,那么高管 iii 的舒适温度就是 Ai−kTA_{i}-k TAi−kT 度。
如果房间的温度是 xxx 度,某位高管的舒适温度是 yyy 度,那么这位高管的不舒适度就是 ∣x−y∣|x-y|∣x−y∣。其中,∣t∣|t|∣t∣ 表示 ttt 的绝对值。每位高管会根据房间的温度,穿上大于等于 000 件合适的外套,使得不舒适度最小。
K 董事长把高管们的不舒适度的最大值称为房间的不舒适度,并决定要把房间的温度设定为使得房间的不舒适度最小的值。但是,设定的温度必须是整数。
给定高管和舒适温度的信息。编写一个程序,求出房间的不舒适度可能的最小值。
输入格式
第一行包含两个整数 N,TN,TN,T。
第二行包含用空格分隔的 NNN 个整数 A1,A2,…,ANA_1, A_2, \ldots, A_NA1,A2,…,AN。
输出格式
输出一行一个整数,表示房间的不舒适度可能的最小值。
输入输出样例 #1
输入 #1
2 4
19 24
输出 #1
1
输入输出样例 #2
输入 #2
3 1
21 19 23
输出 #2
0
输入输出样例 #3
输入 #3
6 8
24 22 21 25 29 17
输出 #3
2
说明/提示
对于所有输入数据,满足:
- 2≤N≤5×1052 \leq N \leq 5\times 10^52≤N≤5×105
- 1≤T≤1091 \leq T \leq 10^{9}1≤T≤109
- 1≤Ai≤109(1≤i≤N)1 \leq A_{i} \leq 10^{9}(1 \leq i \leq N)1≤Ai≤109(1≤i≤N)
详细子任务附加限制及分值如下表所示。
子任务 | 附加限制 | 分值 |
---|---|---|
1 | N=2N=2N=2 | 15 |
2 | N≤3000,T=1N \leq 3000, T=1N≤3000,T=1 | 5 |
3 | N≤3000,T≤2N \leq 3000, T \leq 2N≤3000,T≤2 | 30 |
4 | N≤3000,T≤3000N \leq 3000, T \leq 3000N≤3000,T≤3000 | 35 |
5 | 无附加限制 | 15 |
C++实现
#include<bits/stdc++.h>
using namespace std;
int n,a[500002],t,maxd,k;//变量名如题意
int main()
{
scanf("%d%d",&n,&t);
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
a[i]%=t;//边输入边取模
}
sort(a+1,a+n+1);
for(int i=1;i<=n;i++)
maxd=max(maxd,a[i+1]-a[i]);
maxd=max(maxd,a[1]+t-a[n]);
k=ceil((double(t-maxd))/2.0);
printf("%d",k);
return 0;
}
后续
接下来我会不断用C++来实现信奥比赛中的算法题、GESP考级编程题实现、白名单赛事考题实现,记录日常的编程生活、比赛心得,感兴趣的请关注,我后续将继续分享相关内容
更多推荐
所有评论(0)