`
mmdev
  • 浏览: 12923157 次
  • 性别: Icon_minigender_1
  • 来自: 大连
文章分类
社区版块
存档分类
最新评论

【100题】第三十二 数组、规划

 
阅读更多
一,题目:有两个序列a,b,大小都为n,序列元素的值任意整数,无序;要求:通过交换a,b中的元素,使[序列a元素的和]与[序列b元素的和]之间的差最小。
例如:
var a=[100 ,99 ,98 ,1 ,2 ,3]; var b=[1, 2, 3, 4, 5, 40];
有两个序列a,b,大小都为n,序列元素的值任意整数,无序;
要求:通过交换a,b中的元素,使[序列a元素的和]与[序列b元素的和]之间的差最小。

二,分析

第一种算法:
当前数组a和数组b的和之差为
A = sum(a) - sum(b)

a的第i个元素和b的第j个元素交换后,a和b的和之差为
A' = sum(a) - a[i] + b[j] - (sum(b)- b[j] + a[i])
= sum(a) - sum(b) - 2 (a[i] - b[j])
= A - 2 (a[i] - b[j])

设x= a[i] - b[j]
|A| - |A'| = |A| - |A-2x|

假设A> 0,
当x在(0,A)之间时,做这样的交换才能使得交换后的a和b的和之差变小,
x越接近A/2效果越好,
如果找不到在(0,A)之间的x,则当前的a和b就是答案。

所以算法大概如下:
在a和b中寻找使得x在(0,A)之间并且最接近A/2的i和j,交换相应的i和j元素,
重新计算A后,重复前面的步骤直至找不到(0,A)之间的x为止。

第二种算法:
1.将两序列合并为一个序列,并排序,为序列Source
2.拿出最大元素Big,次大的元素Small
3.在余下的序列S[:-2]进行平分,得到序列max,min
4.将Small加到max序列,将Big加大min序列,重新计算新序列和,和大的为max,小的为min。

a={1,2,3,4,5} b={6,7,8,9,10}

s={1,2,3,4,5,6,7,8,9,10}

a={1,3,6,7,10}

b={2,4,5,8,9}

三,第一种解法源码

#include <iostream>
using namespace std;
class RunClass
{
   public:
         void BalanceArray( int array1[],  int array2[],int n1,int n2);
   private:
          int Sum(int array[],int n);
};

void RunClass::BalanceArray(int array1[], int array2[],int n1,int n2)
{

     if (n1 != n2)
          return;
     int *array=new int[n1];
     if (Sum(array1,n1) < Sum(array2,n2))
     {

           array= array1;
           array1 = array2;
           array2 = array;
     }
            bool ifCycle = true;
            int length = n1;
            while (ifCycle)
            {
               ifCycle = false;     
                for (int i = 0; i < length; i++)
                {
                    for (int j = 0; j < length; j++)
                    {
                        int itemValue = array1[i] - array2[j];
                        int sumValue = Sum(array1,n1) - Sum(array2,n2);
                        if (itemValue < sumValue && itemValue > 0)
                        {
                            ifCycle = true;
                            int item = array1[i];
                            array1[i] = array2[j];
                            array2[j] = item;
                        }
                    }
                }
            }
}

int RunClass::Sum(int array[],int n)
{
       int sum = 0;

       for (int i = 0; i < n; i++)
        {
          sum += array[i];
        }
       return sum;
 }

int main()
{
   int array1[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 90, 0, 0, 100 };
   int array2[] = { -1, -2, -100, -3, 99, -222, -2, -3, -5, -88, 11, 12, 13 };

   RunClass  a;
   a.BalanceArray(array1, array2,13,13);

   for(int i=0;i<13;i++)
       cout<<array1[i]<<"  ";
   cout<<endl;

   for(int i=0;i<13;i++)
       cout<<array2[i]<<"  ";
   cout<<endl;

   return 0;

 }


分享到:
评论

相关推荐

    数据结构试题分章节考研题及答案.rar

    第三 章、栈和队列 试题 参考答案 第四章、串 试题 参考答案 第五章、数组和广义表 试题 参考答案 第六章、树和二叉树 试题 参考答案 第七章、图 试题 参考答案1 参考答案2 第八章、动态存储管理 试题 参考...

    java面向对象程序设计习题集

    第三章 字符串 59 一、选择题 59 二、填空题 63 三、判断题 64 四、编程题 65 第四章 数组 66 一、选择题 66 二、判断题 69 三、填空题 70 四、编程题 71 第五章 类和对象 73 一、选择题 73 二、填空题 79 三、程序...

    C++primer 课后题答案

    第三章 标准库类型 13 第四章 数组和指针 21 第五章 表达式 31 第六章 语句 37 第七章 函数 37 第八章 标准IO库 37 第九章 顺序容器 43 第十章 关联容器 60 第十一章 泛型算法 75 第十二章 类和数据抽象 86 第十三章...

    微软面试100系列 第32题解答

    a的第i个元素和b的第j个元素交换后,a和b的和之差为 A' = sum(a) - a[i] + b[j] - (sum(b) - b[j] + a[i]) = sum(a) - sum(b) - 2 (a[i] - b[j]) = A - 2 (a[i] - b[j]) 设x = a[i] - b[j] |A| - |A'| = |A|...

    清华大学计算机课程之《C++程序设计》

    ◇ 第一章 引言 - 课前索引 - 第一节 计算机语言及其发展 ...◇ 第十二章 输入输出流 - 课前索引 - 第一节 输入输出流类 - 第二节 文件流 - 第三节 字节流类 - 第四节 流错误处理 - 本章小结 - 课后习题

    重庆理工大学 C语言实验报告 十次课后上机实验习题;三次程序设计基础作业;两次程序设计基础课程报告,含所有作业实验+题目+源码

    课后上机实验习题(第三次-选择结构1);课后上机实验习题(第四次-选择结构2);课后上机实验习题(第五次-循环结构1);课后上机实验习题(第六次-循环结构2);课后上机实验习题(第七次-数组);课后上机实验...

    编程实践:Java进阶100例

    第三章:Java基础语法; 第四章:数组的应用; 第五章:面向对象的Java编辑; 第六章:接口与内部类; 第七章:集合的应用; 第八章:异常和反射; 第九章:初识AWT和Swing; 第十章:Swing中的常用组件; 第十一章...

    中国大学MOOC西工大C++课程PPT

    第1讲 C++语言概述 第2讲 信息的表示与存储 ...第32讲 静态成员和友元 第33讲 类的继承与派生 第34讲 派生类成员的访问 第35讲 派生类的构造和析构函数 第36讲 多重继承 第37讲 多态性 第38讲 虚函数

    leetcode第五十四python题-Leetcode-answer-for-python:记录一下刷leetcode题的python方法

    35.第三十五题,搜索插入位置,可以用二分法 38.第三十八题,报数 53.第五十三题,最大子序和,动态规划加遍历 58.第五十八题,最后一个单词的长度, 66.第六十六题,加一 67.第六十七题,二进制求和 69.第六十九题,...

    完整版精品课件 高等数学必学 中山大学 数学实验与数学软件 第05章 MATLAB数值数组与数组化编程(共42页).pptx

    中山大学 数学实验与数学软件 第04章 MATLAB符号计算(三)(共47页).pptx 中山大学 数学实验与数学软件 第05章 MATLAB数值数组与数组化编程(共42页).pptx 中山大学 数学实验与数学软件 第06章 MATLAB矩阵函数与...

    leetcode数组下标大于间距-my-algorithm:我的算法

    数组中的第K个最大元素 把数组排成最小的数 存在重复元素 打乱数组 三数之和 化栈为队 144.二叉树的前序遍历 146.LRU缓存机制 155.最小栈 31.栈的压入、弹出序列 32.从上到下打印二叉树 有效的括号 面试题59 - I. ...

    C语言程序设计标准教程

     本例中用一个循环语句给a数组各元素送入奇数值,然后用第二个循环语句从大到小输出各个奇数。在第一个 for语句中,表达式3省略了。在下标变量中使用了表达式i++,用以修改循环变量。当然第二个for语句也可以这样作...

    汇编语言 20个练习题目 代码加实验报告

    5.17 试编写一个程序,把AX中的十六进制数转换为ASCII码,并将对应的ASCII码依次存放到MEM数组中的四个字节中,例如:当(AX)=2A49H时,程序执行完后,MEM中的4个字节的内容为39H,34H,41H和32H。 5.18 把0~100D...

    c语言题库问题和答案.docx

    数组习题(3):完成十进制数转成为二进制数 71%(2795/3951) 30% 2020-4-23 1043 函数习题(8):递归方法求n阶勒让德多项式的值 63%(1671/2652) 38% 2020-4-23 1044 函数习题(9):分解一个整数的所有素数因子 71%(2321/...

    程序员面试攻略 电子书

    第三章 链表 第四章 树和图 第五章 数组和字符串 第六章 递归算法 第七章 其它程序设计问题 第八章 与计数、测量、排序有关的智力题 第九章 与图形和空间有关的智力题 第十章 计算机基础知识 第十一章非技术问题

    PHP程序设计第2版

    第4章 函数 第5章 数组 ...第7章 高级OOP特性 第8章 错误和异常处理 第9章 字符串和正则表达式 ...第32章 MySQL触发器 第33章 视图 第34章 实用数据库查询 第35章 索引和搜索 第36章 事务 第37章 导入和导出数据

    java习题(含答案).doc

    ★第二章 Java语言基础 ★第三章 面向对象程序设计 ★第四章 Java小应用程序 ★第五章 异常处理 ★第六章 图形与用户界面技术 ★第七章 多线程 ★第八章 多媒体编程 ★第九章 输入与输出流 ★第十章 网络通讯与编程 ...

    程序设计基础答案

    〖程序设计基础〗练习题1 一、选择题(每题1分,共30分) 下列各题A)、B)、C)、D)四个选项中,只有一个选项是正确的,请将正确选项的标记写在题干后的括号内。 1.以下的选项中能正确表示Java语言中的一...

    数据结构算法

    经典算法题每日演练——第十五题 并查集 经典算法题每日演练——第十四题 Prim算法 经典算法题每日演练——第十三题 赫夫曼树 经典算法题每日演练——第十二题 线段树 经典算法题每日演练——第十一题 Bitmap算法 ...

    浙江大学C语言上机练习题附答案

    10016 十进制转换二进制 46 10017 递归函数程序设计求Fabonacci数列 48 10019 改错题error10_1.cpp 49 10022 编程题 50 10026 指定位置输出字符串 50 10027 藏尾诗 51 10028 改错题error11_2.cpp 52 40065 分解质...

Global site tag (gtag.js) - Google Analytics