110508 Pairsumonious Numbers

来源:互联网 发布:淘宝服装模特招聘 编辑:程序博客网 时间:2024/05/17 07:46


#include <iostream>#include <vector>#include <algorithm>#include <math.h>using namespace std;static int FindNumber(const vector<int>& src, int target, int start, int end){if (end < start)return -1;int mid = (start + end) / 2;if (target == src[mid])return mid;if (target > src[mid])return FindNumber(src, target, mid + 1, end);return FindNumber(src, target, start, mid - 1);}static bool FoundAllLeftNumbers(int n, vector<int>& numbers, const vector<int>& sums){// The known numbers: X1, X2, X3// The known sums: sums[0] = X1 + X2, sums[1] = X1 + X3vector<int> otherSums(sums.begin() + 2, sums.end());int index = FindNumber(otherSums, numbers[1] + numbers[2], 0, otherSums.size() - 1); // Find X2 + X3.if (index < 0)return false;otherSums.erase(otherSums.begin() + index); // Now we also know the sum X2 + X3while(otherSums.size()){int nextNumber = otherSums[0] - numbers[0]; // To get X4, X5, ...if (nextNumber < numbers[numbers.size() - 1])break;otherSums.erase(otherSums.begin());int cnt = numbers.size();bool passed = true;for (int i = 1; i < cnt; ++i){index = FindNumber(otherSums, numbers[i] + nextNumber, 0, otherSums.size() - 1);if (index < 0){passed = false;break;}otherSums.erase(otherSums.begin() + index);}if (!passed)break;numbers.push_back(nextNumber);}if (otherSums.size() > 0){int cnt = numbers.size();for (int i = 0; i < cnt - 3; ++i)numbers.pop_back(); // Remove the newly added numbers.return false;}return true;}static void FindNumbers(int n, vector<int>& sums){if (n <= 1){cout << "Impossible" << endl;return;}if (n == 2){cout << (sums[0] / 2) << ' ' << (sums[0] - (sums[0] / 2)) << endl;return;}sort(sums.begin(), sums.end());// ceil(sums[0] / 2.0) <= X2 <= floor(sums[n - 1] / 2.0)// X1 = sums[0] - X2// X3 = sums[1] - X1int lower = static_cast<int>(ceil(sums[0] / 2.0));int upper = static_cast<int>(floor(sums[n - 1] / 2.0));bool found = false;vector<int> numbers;for (int i = lower; i <= upper; ++i){numbers.push_back(sums[0] - i); // X1numbers.push_back(i); // X2numbers.push_back(sums[1] - sums[0] + i); // X3if (FoundAllLeftNumbers(n, numbers, sums)){int cnt = numbers.size();for (int i = 0; i < cnt; ++i){if (i != 0)cout << ' ';cout << numbers[i];}cout << endl;return;}numbers.pop_back();numbers.pop_back();numbers.pop_back();}cout << "Impossible" << endl;}static int GetSumsCnt(int n){return ((n - 1) * n) >> 1;}static void Test(){int n, temp;vector<int> sums;while(cin >> n){sums.clear();int cnt = GetSumsCnt(n);for (int i = 0; i < cnt; ++i){cin >> temp;sums.push_back(temp);}FindNumbers(n, sums);}}int main(int argc, char* argv[]){Test();return 0;}


原创粉丝点击