名企笔试:字符串子串(网易2017春招笔试题)
题目:
一种双核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; }