zoukankan      html  css  js  c++  java
  • 1、双核处理--网易2017春招

    [编程题] 双核处理
    时间限制:1秒
    空间限制:32768K
    一种双核CPU的两个核能够同时的处理任务,现在有n个已知数据量的任务需要交给CPU处理,假设已知CPU的每个核1秒可以处理1kb,每个核同时只能处理一项任务。n个任务可以按照任意顺序放入CPU进行处理,现在需要设计一个方案让CPU处理完这批任务所需的时间最少,求这个最小的时间。 
    输入描述:
    输入包括两行: 第一行为整数n(1 ≤ n ≤ 50) 第二行为n个整数length[i](1024 ≤ length[i] ≤ 4194304),表示每个任务的长度为length[i]kb,每个数均为1024的倍数。
     
     
    输出描述:
    输出一个整数,表示最少需要处理的时间
     
    输入例子:
    5 3072 3072 7168 3072 1024
     
    输出例子:
    9216
     
    解题思路:本题关键是将数组分成两个数组,差值最小
    举个例子,有1,2,3一共3个数,将这三个数分成两部分,有3种分法1 | 2,3或者1,2| 3 或者1,3|2,然后计算每部分所有数的和,
    1 | 2,3 -> 和为1,5,和的差是4
    1 2| 3 -> 和为3,3,和的差是0
    1 3|2 -> 和为4,2,和的差是2
    所以按照1,2| 3分得到的和的差最小。
     
    那么任意给定一个数组,如何找出最小值呢?
     
    思路:差最小就是说两部分的和最接近,而且和所有数的和SUM的一半也是最接近的。假设用sum1表示第一部分的和,sum2表示第二部分的和,SUM表示所有数的和,那么sum1+sum2=SUM。假设sum1<sum2 那么SUM/2-sum1 = sum2-SUM/2;
    所以我们就有目标了,使得sum1<=SUM/2的条件下尽可能的大。也就是说从n个数中选出某些数,使得这些数的和尽可能的接近或者等于所有数的和的一半。这其实就是简单的背包问题了:
    背包容量是SUM/2. 每个物体的体积是数的大小,然后尽可能的装满背包。
    dp方程:f[i][V] = max(f[i-1][V-v[i]]+v[i], f[i-1][V] ) (i放入v[i]和i不放入,前i-1个放入v中的最大值)
    f[i][V]表示用前i个物体装容量为V的背包能够装下的最大值,f[i-1][V-v[i]]+v[i]表示第i个物体装进背包的情况,f[i-1][V]表示第i件物品不装进背包的情况。
     1 int dp[n+1][sum/2+1];
     2 memset(dp,0,sizeof(dp));
     3 for(int i=1; i<n; ++i)
     4 {
     5     for(int j=0;j<=sum/2;j++)
     6     {
     7          if(j<a[i])
     8             dp[i][j] = dp[i-1][j];
     9          else
    10             dp[i][j] = max(dp[i-1][j],dp[i-1][j-a[i]]+a[i]);
    11     }
    12 }
    本题转换成,选出其中一个数组的和sum1最接近sum/2即可,则结果为max(sum-sum1,sum1)
    二维dp
     1 #include <iostream>
     2 #include <algorithm>
     3 #include <math.h>
     4 #include <memory.h>
     5 using namespace std;
     6  
     7 int main()
     8 {
     9     int n;
    10     while(cin>>n)
    11     {
    12         int a[n];
    13         int sum = 0;
    14         //求和先除以1024,得到结果再乘以1024,减少计算次数
    15         for(int i=1;i<=n;i++)
    16         {
    17             cin>>a[i];
    18             sum += a[i]/1024;
    19         }
    20         int dp[n+1][sum/2+1];
    21         memset(dp,0,sizeof(dp));
    22         for(int i=1;i<=n;i++)
    23         {
    24             for(int j=0;j<=sum/2;j++)
    25             {
    26                 if(j<(a[i]/1024))
    27                 {
    28                     dp[i][j] = dp[i-1][j];
    29                 }
    30                 else
    31                 {
    32                     dp[i][j] = max(dp[i-1][j],dp[i-1][j-a[i]/1024]+a[i]/1024);
    33                 }
    34             }
    35         }
    36  
    37         cout<<max(dp[n][sum/2],sum-dp[n][sum/2])*1024<<endl;
    38  
    39     }
    40     return 0;
    41 }


    转化为一维的背包问题:

     1 #include <iostream>
     2 #include <algorithm>
     3 #include <math.h>
     4 #include <memory.h>
     5 using namespace std;
     6  
     7 int main()
     8 {
     9     int n;
    10     while(cin>>n)
    11     {
    12         int a[n];
    13         int sum = 0;
    14         //求和先除以1024,得到结果再乘以1024,减少计算次数
    15         for(int i=0;i<n;i++)
    16         {
    17             cin>>a[i];
    18             sum += a[i]/1024;
    19         }
    20         int dp[sum/2+1];
    21         memset(dp,0,sizeof(dp));
    22         for(int i=0;i<n;i++)
    23         {
    24             for(int j=sum/2;j>=a[i]/1024;j--)
    25             {
    26  
    27                 dp[j] = max(dp[j],dp[j-a[i]/1024]+a[i]/1024);
    28  
    29             }
    30         }
    31  
    32         cout<<max(dp[sum/2],sum-dp[sum/2])*1024<<endl;
    33  
    34     }
    35     return 0;
    36 }


    注意:0 1背包的初始化问题,恰装满 dp[0] = 0, dp[1...v] = 无限小(除0外其他背包恰装满未知,因此设置为负无穷)
                                           不恰好满  dp[0...v] = 0(不恰装满,可以所有背包不装,所以为0)

  • 相关阅读:
    DPDK安装方法 17.12.13
    numa.h:No such file or directory 解决方法
    17秋 软件工程 第六次作业 Beta冲刺 Scrum3
    17秋 软件工程 第六次作业 Beta冲刺 总结博客
    17秋 软件工程 第六次作业 Beta冲刺 Scrum2
    Paper Reviews and Presentations
    17秋 软件工程 第六次作业 Beta冲刺 Scrum1
    17秋 软件工程 第六次作业 Beta冲刺
    error: could not create '/System/Library/Frameworks/Python.framework/Versions/2.7/share': Operation not permitted
    17秋 软件工程 个人作业 软件产品案例分析
  • 原文地址:https://www.cnblogs.com/qqky/p/6904010.html
Copyright © 2011-2022 走看看