- 论坛徽章:
- 0
|
本帖最后由 Frahm 于 2013-04-11 21:42 编辑
我想这次应该是对的了,之前忽略了负数的问题,还有对比顺序问题,现在下面这个的基本思想是:
假设两个数组都已合并到数组a[2*n], 要把它均匀地分到两个数组里,很容易想到,插入的顺序应该是从对数组和影响最大的那个开始,再依次插入影响小的。因为值可能是负的,那么简单的排序再依次插入就行不通了,因为一个值对整体数组和的影响力不在于它的值本身,而是其绝对值,所以要按原值的绝对值排序。
其次,对于某些特殊情况比如两个数组的和相等时,那么下一个值该放到哪里?如果随意的放,那么很可能导致一个数组在经历多次这种情况后被填满,而后面还有很多数没有参与求和比较,所以我采用的策略是在和相等时,把新值放到元素个数少的那一个里。因为当任一数组满时,剩下的未插入的元素数越少越好(越多则代表越多的数据被浪费,未参与求和比较)
- bool compare(int lhs, int rhs) {
- return abs(lhs) > abs(rhs);
- }
- int main() {
- static const int n = 4;
- //int a[2*n] = {-1000, -100, -99, -10, 1, 10, 11, 100 };
- int a[2*n] = {-19, -5, -1, 3, 7, 11, 13, 17};
- int sum1 = 0, sum2 = 0;
- int a1[n], a2[n];
- int count1 = 0, count2 = 0;
- //按绝对值降序排序
- std::sort(a, a + 2 * n, compare);
- for(int i = 0; i < 2 * n; ++i) {
- if(count1 == n) { //如果数组1满了
- sum2 += a[i];
- a2[count2++] = a[i];
- } else if(count2 == n) {//如果数组2满了
- sum1 += a[i];
- a1[count1++] = a[i];
- } else if(sum1 == sum2) {//特殊情况处理
- if(count1 < count2) {
- sum1 += a[i];
- a1[count1++] = a[i];
- } else {
- sum2 += a[i];
- a2[count2++] = a[i];
- }
- } else if(sum1 < sum2 && a[i] > 0 || sum1 > sum2 && a[i] < 0){
- sum1 += a[i];
- a1[count1++] = a[i];
- } else {
- sum2 += a[i];
- a2[count2++] = a[i];
- }
- }
- std::cout << "a1:\n";
- for(int i : a1) {
- std::cout << i << ' ';
- }
- std::cout << "\na2:\n";
- for(int i : a2) {
- std::cout << i << ' ';
- }
- std::cout << '\n';
- }
复制代码 |
|