题目:
一种双核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的任务时长和是最小的就将下一个任务分配给谁!
此题网上的其他答案不太靠谱哟!
代码实现:
#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;
}