题目:


一种双核CPU的两个核能够同时的处理任务,现在有n个已知数据量的任务需要交给CPU处理,假设已知CPU的每个核1秒可以处理1kb,每个核同时只能处理一项任务。n个任务可以按照任意顺序放入CPU进行处理,现在需要设计一个方案让CPU处理完这批任务所需的时间最少,求这个最小的时间。 


输入描述:


输入包括两行:

第一行为整数n(1 ≤ n ≤ 50)

第二行为n个整数length[i](1024 ≤ length[i] ≤ 4194304),表示每个任务的长度为length[i]kb,每个数均为1024的倍数。


输出描述:


输出一个整数,表示最少需要处理的时间


输入例子1:


5

3072 3072 7168 3072 1024


输出例子1:


9216


输出例子1:


9216


解题思路:


看到题后,首先想这个应该属于分配问题!先将被分配的资源排好队,然后根据情况分配给两个CPU中的一个。想的简单的就是,排好队从小到大 先给A一个再给B一个,直至分完。但是这种分法只考虑到两任务之间存在差值,却没有考虑差值大小会不会影响下一次分配。所以我采取从大到小分配的方式,然后再每一次分配前还得先确定哪一个CPU的任务时长和是最小的就将下一个任务分配给谁!

此题网上的其他答案不太靠谱哟!名企笔试:字符串子串(网易2017春招笔试题)_网易2017春招笔试题


代码实现:



#include <stdio.h>
int sumArray(int array[],int n)            //计算某个CPU上面的任务时间
{
    int i;
    int sum=0;
    for(i=0;i<n;i++)
    {
        sum=sum+array[i];
    }
    return sum;
}
void BubbleSort(int a[],int length)        //对任务进行从大到小排序
{  
    int i, j, temp;

    for(i = 0; i < length; ++i){

        for(j = i + 1; j < length; ++j){

            if(a[j] >a[i]){    //如果后一个元素da于前一个元素则交换

                temp = a[i];

                a[i] = a[j];

                a[j] = temp;

            }

        }
    }
}  
 
int main()
{
    int n;
    scanf("%d",&n);
    int number[n];
    int ACpu[n],BCpu[n];       //A B CPU

    int i;
    for(i=0;i<n;i++)           //代表每个CPU都可以接受任何任务 初值置零
    {
        ACpu[i]=0;  
        BCpu[i]=0;
    }
    for(i=0;i<n;i++)
        scanf("%d",&number[i]);
    BubbleSort(number,n);
    for(i=0;i<n;i++)
    {
        if(sumArray(ACpu,n)<=sumArray(BCpu,n))
        {
            ACpu[i]=number[i];
        }
        else
        {
            BCpu[i]=number[i];
        }
        
    }
    if(sumArray(ACpu,n)>sumArray(BCpu,n))    //最后统计哪组任务时长最长,则输出数值
        printf("%d\n",sumArray(ACpu,n));
    else
        printf("%d\n",sumArray(BCpu,n));
    return 0;
}