交换a,b中的元素,a序列的和 与 b序列的和 之间的差最小

     通过交换a,b中的元素,是的a序列的和 与 b序列的和 之间的差最小
     
        比如a = [1, 2, 3, 4, 5]
                b = [6, 7, 8, 9, 10] 那么把b中一些大的交换到a去,使得他们之间的差值更小
     
        思路:
            假设a的和为sa,b的和为sb,那么他们的差值
            diff = abs(sa-sb);
            为了缩小差距,那么需要交换两个值,如果这两个值最接近diff/2,那么
            交换之后diff就为0了,所以我们要尽量找到两个差值为diff/2的元素,进行交换即可
     
            再递归即可
        */  
      
      
    #include <iostream>  
    using namespace std;  
    #include "math.h"  
      
    int a[] = { 100, 98, 99, 1, 2,3 };  
    int b[] = { 1, 2,3, 4, 5 ,40};  
    int g_count = 6;  
      
    // 对数组进行求和  
    int sum(int arr[], int n)  
    {  
        int s = 0;  
        for (int i = 0; i < n; i++)  
        {  
            s += arr[i];  
        }  
        return s;  

    } 

     

    void swap_(int n)  
    {  
        int sa = sum(a, n);  
        int sb = sum(b, n);  
        int* mi;  
        int* ma;  
        if (sa > sb) { ma = a; mi = b; }  // 根据大小来决定移动方向  
        else         { ma = b; mi = a; }  
      
        int diff = abs(sa - sb)/2;  // 数组和差值  
        if (diff == 0) return;      // 如果数组和之差是0,那么说明不需要再交换什么了  
          
        int d = 0;  
        int maxindex;  
        int minindex;  
        for (int i = 0; i < n; i++)   // 对所有的元素进行比较  
        for (int j = 0; j < n; j++)  
        {  
            int t = ma[i] - mi[j];   // 如果某对元素的差值,复合条件,并大于d,那么要更新d和当前下标  
            if (t > 0 && t <= diff && t>d)  
            {  
                d = t;  
                maxindex = i;  
                minindex = j;  
            }  
        }  
      
        if (d)  // 最后如果d大于0,那么说明有需要交换的  
        {  
            // 进行交换后递归,在寻求下一个能交换的元素  
            int t = ma[maxindex];  
            ma[maxindex] = mi[minindex];  
            mi[minindex] = t;  
            swap_(n);  
        }  
      
        // 如果d是0,那么不需要再找了,没有办法再缩小差距了  
    }  
      
    /* 打印数组 */  
    void print(int n)  
    {  
        cout <<"now a[] is:";  
        for (int i = 0; i < n; i++)  
        {  
            cout << a[i] << " ";  
        }  
        cout << endl << "now b[] is:";  
        for (int i = 0; i < n; i++)  
        {  
            cout << b[i] << " ";  
        }  
        cout << endl << "--------------------" << endl;  
    }  
      
    /* 测试主函数 */  
    int main()  
    {  
        // 先打印之前的数组  
        print(g_count);  
      
        // 进行交换  
        swap_(g_count);  
      
        // 打印交换后的数组  
        print(g_count);  

        system("pause"); 


程序运行结果





  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值