信奥赛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