题目:输入一组正整数为集合N;从N中任意取两个数求和得到集合A;从N任意取两个数求差的绝对值得到集合B;从集合A,B中各取一个数得到集合D;集合D中最大值d1,最小值d2,元素个数为ds,求d1+d2+ds;
思路:简单,按题目顺序来即可,注意集合元素的去重和排序即可。这题考的时候我有点粗心,一个循环遍历中少加了1居然一直没看到,然后我用来做题的电脑上居然没有gdb,没法调试,光从眼睛看居然没有发现该错误,明明代码量这么少(捂脸笑哭)。
#include <iostream>
#include <vector>
#include <numeric>
#include <limits>
#include <cmath>
#include <algorithm>
using namespace std;
// 请完成下面这个函数,实现题目要求的功能
// 当然,你也可以不按照这个模板来作答,完全按照自己的想法来 ^-^
int result(const vector <int>& inputs) {
vector <int> a;
vector <int> b;
vector <int> d;
int len = inputs.size();
int resultNum = 0;
for (int i = 0; i < len; i++)
{
for (int j = i + 1; j < len; j++)//就在这个地方少加了1,居然一直没发现
{
int calTmp = inputs[i] + inputs[j];
a.push_back(calTmp);
}
}
for (int i = 0; i < len; i++)
{
for (int j = i + 1; j < len; j++)
{
int calTmp = abs(inputs[i] - inputs[j]);
b.push_back(calTmp);
}
}
sort(a.begin(),a.end());
a.erase(unique(a.begin(), a.end()), a.end());
sort(b.begin(),b.end());
b.erase(unique(b.begin(), b.end()), b.end());
int aLen = a.size();
int bLen = b.size();
for (int i = 0; i < aLen; i++)
{
for (int j = 0; j < bLen; j++)
{
int calTmp = abs(a[i] - b[j]);
d.push_back(calTmp);
}
}
sort(d.begin(),d.end());
d.erase(unique(d.begin(), d.end()), d.end());
sort(d.begin(),d.end());
resultNum = d.front() + d.back() + d.size();
return resultNum;
}
int main() {
int size = 0;
cin >> size;
cin.ignore (numeric_limits<std::streamsize>::max(), '\n');
vector<int> points;
for(size_t i=0; i<size; ++i) {
int item;
cin >> item;
cin.ignore (numeric_limits<std::streamsize>::max(), '\n');
points.push_back(item);
}
int res = result(points);
cout << res << endl;
return 0;
}