题目描述
Fengsensei最近新买了一台电脑,为了对cpu有更加深入的了解,Fengsensei开始了对这台电脑的双核 cpu进行测试。为了简化问题,我们进行如下的定义,cpu有两个核分别为A和B,每次测试共有n(n<100)个任务,每个任务在A,B上执行的时间分别为Ai,Bi(Ai,Bi<100).每个任务只能在cpu的其中一个核上执行,现在Fengsensei想知道执行完这些任务所需要的最短时间是多少。
输入
第一个行为一个数k,代表样例的个数. 接下来每个样例第一行一个数n,代表任务的个数,第二行为n个非负整数,表示任务1..n在cpu A 上处理的时间Ai,第三行为n个非负整数,表示任务1..n在cpu B 上处理的时间Bi.
输出
对于每组样例,输出一个数T,表示执行完这些任务所需要的最短时间。
样例输入
1 6 2 5 7 10 5 2 3 8 4 11 3 4
样例输出
15
答案
#include<stdio.h>
#include<string.h>
int main()
{
int k,sa[
2][
10000],sb[
2][
10000],i,j,n,a[
100],b[
100],s,l1,l2;
scanf(
"%d",&k);
while(k--)
{
scanf(
"%d",&n);
if(n==
0) {
printf(
"0\n");
continue;}
memset(sa,
0,
sizeof(sa));
memset(sb,
0,
sizeof(sb));
for(i=
0;i<n;i++)
scanf(
"%d",&a[i]);
for(i=
0;i<n;i++)
scanf(
"%d",&b[i]);
sa[
0][
0]=
1;
if(a[
0]==
0) sb[
0][
0]=
0;
else {sa[
0][a[
0]]=
1;sb[
0][
0]=b[
0];}
for(i=
1;i<n;i++)
{
l1=(i-
1)%
2;l2=i%
2;
for(j=i*
100;j>=
0;j--)
if(sa[l1][j]==
1)
{
sa[l2][j]=
1;
sb[l2][j]=sb[l1][j]+b[i];
if(!sa[l2][j+a[i]]) {sa[l2][j+a[i]]=
1;sb[l2][j+a[i]]=sb[l1][j];}
else if(sb[l1][j]<sb[l2][j+a[i]]) sb[l2][j+a[i]]=sb[l1][j];
}
memset(sa[l1],
0,i*
100*
sizeof(
int));
memset(sb[l1],
0,i*
100*
sizeof(
int));
}
l1=(n-
1)%
2;
s=sb[l1][
0];
for(j=
0;j<
10000;j++)
{
if(sa[l1][j]) {
if(sb[l1][j]<j) i=j;
else i=sb[l1][j];}
if(i<s) s=i;
}
printf(
"%d\n",s);
}
return 0;
}
转载请注明原文地址: https://ju.6miu.com/read-968868.html