1 条题解
-
0
自动搬运
来自洛谷,原作者为

Miller2019
求互关!|古人云:Miller2019竞有多弱?无人知之。|我只是一个只会刷红/水题的蒟蒻!|信息、数学、物理竞赛为什么都来害我啊!!!|已淡谷搬运于
2025-08-24 22:19:58,当前版本为作者最后更新于2020-04-16 23:06:54,作者可能在搬运后再次修改,您可在原文处查看最新版自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多
以下是正文
我的思路:先读入那三个数,再排序一下。然后计算出第 2 小的数的与第 1 小的数的差 c1 和第最大数与第 2 小的数的差 c2。
然后分三种情况讨论:
我们设数列中的四个数分别为: m1, m2, m3, m4 。
-
c1 = c2 这样差一样,一定有一种情况是已输入 m1, m2, m3,我们输出 m4 = m3 + 公差 即可。
-
c1 > c2 这样前面的差大,一定有一种情况是已输入 m1, m3 ,m4 ,我们输出 m2 = m3 - 公差 或 m1 + 公差 即可。
-
c1 < c2 这样后面的差大,一定有一种情况是已输入 m1, m2 ,m4 ,我们输出 m3 = m4 - 公差 或 m2 + 公差 即可。
最短代码:
#include<bits/stdc++.h> int n[3],c1,c2,c3; int main() { scanf("%d%d%d",n,n+1,n+2); //读入 n[0],n[1],n[2]。 std::sort(n,n+3);//排序一下,因为我们是从下标 0 使用到下标 2 的,所以排序的起始位置是 n (或 n+0 ),结束位置是 n+3。 c1=n[1]-n[0],c2=n[2]-n[1]; //计算差。 printf("%d",c1==c2?n[2]+c1:(c1>c2?n[1]-c2:n[2]-c1)); //这里用了三目运算符,我们先判断是否是第 1 种情况,执行计算;如果不是,在判断是否是第二种情况。最后计算出表达式的值,输出即可。 return 0; }亲测:16ms / 696.00KB
感觉有点慢,我就优化了一下。因为数据中可能有排好序的数据,可以用
is_sorted判断一下,其它跟上面一样。这里
is_sorted默认检测是否已经是从小到大排序的,是则返回 1 ,反之返回 0。我们也可以编写 cmp 函数改变规则(同 sort)。但是请注意:
is_sorted是 C++11 的函数。#include<bits/stdc++.h> int n[3],c1,c2,c3; int main() { scanf("%d%d%d",n,n+1,n+2); if(!std::is_sorted(n,n+3))std::sort(n,n+3);//如果不是有序的,则执行 sort ;反之不执行。 c1=n[1]-n[0],c2=n[2]-n[1]; printf("%d",c1==c2?n[2]+c1:(c1>c2?n[1]-c2:n[2]-c1)); return 0; }亲测:14ms / 728.00KB
这样有效提高了在输入数据是有序情况下的速度。
这是目前评测记录最优解第 3(不算 O2)。
蒟蒻橙后第 2 篇题解。
-
- 1
信息
- ID
- 5391
- 时间
- 1000ms
- 内存
- 32MiB
- 难度
- 1
- 标签
- 递交数
- 0
- 已通过
- 0
- 上传者