很有意思的笔试题
一种双核 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
思路
这里提供一个很简单却有效的思路,首先将接收到的数值进行从大到小的一个排序,然后想象有两个cpu,将最大的两个数值分别给到两个CPU,之后比较两者的大小,小的一方继续按顺序加值,如5.4.3.2.1,cpu1=5,cpu2=4,4<5,则cpu2+3=7,7>5,则cpu1+2=7,依次比较加值,,直到所有值给完结束。此时两个cpu最大的一个值便是本次总任务完成的最短时间。
代码实现
解:
#include<stdio.h>
int main()
{
int n=5;
int i = 0;
int a[5] = {0};
printf("input data:\n");
for(i = 0;i < n;i++)
{
scanf("%d",&a[i]);
}
for(i = 0;i < n;i++)
{
for(int j = 0;j < n-1-i;j++)
{
if(a[j] < a[j+1])
{
int temp;
temp = a[j];
a[j] = a[j+1];
a[j+1] = temp;
}
}
}
int cpu1, cpu2;
cpu1 = a[0];
cpu2 = a[1];
i = 2;
while(i < n)
{
if(cpu1 >= cpu2)
{
cpu2 = cpu2 + a[i];
i++;
}
else if(cpu1 < cpu2)
{
cpu1 =cpu1 + a[i];
i++;
}
}
if(cpu1 > cpu2)
{
printf("%d\n",cpu1);
}
else
{
printf("%d\n",cpu2);
}
return 0;
}