信奥赛CSP-J复赛集训(模拟算法专题)(6):P6352 [COCI 2007/2008 #3] CETIRI

题目描述
你原本有 4 4 4 个数,它们从小到大排序后构成了等差数列。
但是现在丢失了一个数,并且其余的三个数的顺序也被打乱了。
请你找出第四个数。
输入格式
输入一行三个整数。保证这些数字在 − 100 ∼ 100 -100\sim 100 −100∼100 之间。
输出格式
输出一行一个数,为第四个数。
方案可能不是唯一的,但保证一定存在,本题使用SPJ。
输入输出样例 #1
输入 #1
4 6 8
输出 #1
10
输入输出样例 #2
输入 #2
10 1 4
输出 #2
7
说明/提示
说明
题目译自 COCI2007-2008 CONTEST #3 T1 CETIRI。
AC代码:
#include<bits/stdc++.h>
using namespace std;
int a[5]; // 使用a[1]~a[3]存储输入的数,a[4]存储结果
int main() {
// 输入三个数
for(int i = 1; i <= 3; i++) {
cin >> a[i];
}
// 将三个数从小到大排序
sort(a + 1, a + 4);
int d1 = a[2] - a[1]; // 前两个数的差值
int d2 = a[3] - a[2]; // 后两个数的差值
// 根据差值判断缺失的数
if (d1 == d2) {
// 差值相等,说明已经是等差数列,下一个数为末尾数加公差
a[4] = a[3] + d1;
} else if (d2 > d1) {
// 后差值较大,说明中间缺失一个数,补在a[2]和a[3]之间
a[4] = a[2] + d1;
} else {
// 前差值较大,说明前面缺失一个数,补在a[1]和a[2]之间
a[4] = a[1] + d2;
}
cout << a[4];
return 0;
}
功能分析:
-
输入与排序
代码首先读取三个整数并存入数组a[1]、a[2]、a[3],然后对这三个数进行升序排序,确保后续逻辑基于有序序列。 -
差值计算
计算前两个数的差值d1和后两个数的差值d2。这两个差值用于判断等差数列的公差及缺失元素的位置。 -
逻辑分支处理
- 情况1:
d1 == d2
说明三个数已构成等差数列,缺失的第四个数为最后一个数加上公差d1。例如输入[1, 3, 5],输出7。 - 情况2:
d2 > d1
表示后两个数的间隔更大,缺失数应位于中间位置,公差为d1。例如输入[1, 3, 7],补5(公差2)。 - 情况3:
d1 > d2
表示前两个数的间隔更大,缺失数应位于前部,公差为d2。例如输入[1, 5, 7],补3(公差2)。
- 情况1:
-
输出结果
最终输出计算的缺失数,确保四个数形成完整的等差数列。
示例验证:
- 输入
1 5 7
排序后为[1, 5, 7],d1=4,d2=2。由于d1 > d2,补1 + 2 = 3,结果序列为[1, 3, 5, 7]。 - 输入
7 3 1
排序后同上,结果相同。 - 输入
1 2 4
排序后[1, 2, 4],d1=1,d2=2。因d2 > d1,补2 + 1 = 3,结果序列为[1, 2, 3, 4]。
该代码通过排序和差值分析,高效地补全缺失项,确保生成等差数列。
文末彩蛋:
关注并查看老师的个人主页,学习完整csp信奥赛完整系列课程: https://edu.csdn.net/lecturer/7901















![[数据分享第七弹]全球洪水相关数据集](https://i-blog.csdnimg.cn/img_convert/8294456b9219181cd8dc79fb60b85e75.png)




