题目描述
Farmer John 的奶牛正在 mooZ 视频会议平台上举行每日集会。
她们发明了一个简单的数字游戏,为会议增添一些乐趣。
Elsie 有三个正整数 A、B 和 C (A≤B≤C)。
这些数字是保密的,她不会直接透露给她的姐妹 Bessie。
她告诉 Bessie 七个范围在 1…109 之间的整数(不一定各不相同),并宣称这是 A、B、C、A+B、B+C、C+A 和 A+B+C 的某种排列。
给定这七个整数,请帮助 Bessie 求出 A、B 和 C。
可以证明,答案是唯一的。
输入格式
输入一行,包含七个空格分隔的整数。
输出格式
输出 A、B 和 C,用空格分隔。
数据范围
1≤所有输入的整数≤109
样例
输入样例:
2 2 11 4 9 7 9
输出样例:
2 2 7
思路一:
贪心
想了一会儿,挺容易的QAQ
有2种思路
首先根据数学知识和题目意思来看,要排序;
其次,我们假设a,b,c,大小依次增加;
那么我们排序后,数组最后一个数一定是a+b+c
第一,第二个数一定是a,b,否则不可能有后面所有的数
接下来就是重头戏:
求c的话,可以用最后一个数(a+b+c)减去数组前面俩个数(a,b),剩下的数一定是c
当然,可以看看数组倒数第二个数,一定是a,b,c中最大的俩个数之和(b+c),此时减去数组第二个数,剩下的一定是c
注意这里不能减去第一个数(最小数a),不满足题意
证毕
时间复杂度 o(n)
参考文献
C++ 代码
#include <iostream>
#include <cstring>
#include <set>
#include <algorithm>
using namespace std;
const int N = 10;
int a[N];
int main()
{
for (int i = 0; i < 7 ; i ++ )cin>>a[i];
sort(a,a+7);
cout<<a[0]<<' '<<a[1]<<' '<<a[5]-a[1]<<endl;
return 0;
}
//这样写也行
#include <iostream>
#include <cstring>
#include <set>
#include <algorithm>
using namespace std;
const int N = 10;
int a[N];
int main()
{
for (int i = 0; i < 7 ; i ++ )cin>>a[i];
sort(a,a+7);
cout<<a[0]<<' '<<a[1]<<' '<<a[6]-a[1]-a[0]<<endl;
return 0;
}
Java 代码
import java.util.*;
import java.io.*;
public class Main{
static int a[]=new int [7];
public static void main(String[] args) {
Scanner cin =new Scanner(System.in);
for(int i=0;i<7;i++)a[i]=cin.nextInt();
Arrays.sort(a,0,7);
// System.out.println(a[0] + " " + a[1] + " " + (a[5] - a[1]));
System.out.println(a[0] + " " + a[1] + " " + (a[6] - a[1]-a[0]));
}
}
Python3代码
def main():
s=list(map(int ,input().split()))
s.sort()
print(s[0],s[1],s[6]-s[0]-s[1],sep=" ")
if __name__ == "__main__":
main()
GO代码
package main
import (
"fmt"
"sort"
)
func main(){
a:=make([]int ,7)
for i := 0; i < 7; i++{
fmt.Scanf("%d",&a[i])
}
sort.Ints(a)
fmt.Printf("%d %d %d", a[0], a[1], a[5]-a[1])
}
欢迎留言点赞
嗷嗷嗷~