20190409 趋势科技编程题
给定一个整数数组A,拥有N个不重复的整数。找到数组中两个数之和出现最多的和,如果有多种可能,输出全部结果(结果顺序任意) 分数:15
输入格式:
第一行:N(数组个数)
第二行:N个空格分隔的整数;
输出格式:
打印输出结果,多个结果多行显示。
样本输入:
8
1 8 3 11 4 9 2 7
样本输出:
11
10
12
样本说明:
对于上述样本数组,
7+4=11,8+3=11,9+2=11
1+9=10,8+2=10,7+3=10
1+11=12,8+4=12,9=3=12
和11,10,12均出现了最多的三次,所以输出上述结果。
C++代码:
#include <iostream>
#include <map>
using namespace std;
int main()
{
int n;
cin >> n; //n个数
int *data = new int[n];
for (int i = 0; i < n; ++i)
{
cin >> data[i];
}
map<int, int> m; //构造map,<和值,和值出现次数>
int sum = 0;
for (int i = 0; i < n; ++i)
{
for (int j = i + 1; j < n; ++j)
{
sum = data[i] + data[j];
m[sum] += 1;
}
}
map<int, int>::iterator it;
int max = m[0];
for (it = m.begin(); it != m.end(); it++)
{
if ((*it).second > max)
max = (*it).second;
}
for (it = m.begin(); it != m.end(); it++)
{
if ((*it).second == max)
cout << (*it).first << endl;
}
system("pause");
}
改进版
int main()
{
int n;
cin >> n; //n个数
int *data = new int[n];
for (int i = 0; i < n; ++i)
{
cin >> data[i];
}
map<int, int> m; //构造map,<和值,和值出现次数>
int sum = 0;
int count;
int max = 0;
for (int i = 0; i < n; ++i)
{
for (int j = i + 1; j < n; ++j)
{
sum = data[i] + data[j];
count = ++m[sum];
if (count > max)
max = count;
}
}
map<int, int>::iterator it;
for (it = m.begin(); it != m.end(); it++)
{
if ((*it).second == max)
cout << (*it).first << endl;
}
system("pause");
}
小白一枚,请各位大佬手下留情~