1.双核处理
-
题目:
一种双核CPU的两个核能够同时的处理任务,现在有n个已知数据量的任务需要交给CPU处理,假设已知CPU的每个核1秒可以处理1kb,每个核同时只能处理一项任务。n个任务可以按照任意顺序放入CPU进行处理,现在需要设计一个方案让CPU处理完这批任务所需的时间最少,求这个最小的时间。- 输入包括两行:
第一行为整数n(1 ≤ n ≤ 50)
第二行为n个整数length[i](1024 ≤ length[i] ≤ 4194304),表示每个任务的长度为length[i]kb,每个数均为1024的倍数。
- 输入包括两行:
题目分析:
此题是01背包问题的变形。完成所有n个任务需要sum时间,放入两个cpu中执行,假设第一个cpu处理时间为n1,第二个cpu时间为sum-n1,并假设n1 <= sum/2,sum-n1 >= sum/2,要使处理时间最小,则n1越来越靠近sum/2,最终目标是求max(n1,sum-n1)的最大值。
转换为01背包问题:已知最大容纳时间为sum/2,有n个任务,每个任务有其的完成时间,求最大完成时间。
01背包问题:已知背包的最大容量,有n个物品,价值分别是wi,求如何放物品能取得最大值
- 代码:
package WangYi2017Spring;
import java.util.Scanner;
public class Main {
public final static int MAX_N = 50+1;
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n;
int[] time = new int[MAX_N];
int sum = 0; //两个cpu运行的总时间
while(sc.hasNext()){
n = sc.nextInt();
for(int i=0;i<n;i++){
time[i] = sc.nextInt()>>10; //"每个数均为1024的倍数"
sum += time[i];
}
int[] dp = new int[sum/2+1];
for(int i=0;i<n;i++){
for(int j=(sum/2);j>=time[i];j--){
dp[j] = Math.max(dp[j],dp[j-time[i]]+time[i]);
}
}
System.out.println((sum-dp[sum/2])<<10);
}
}
}
2.赶去公司
-
题目:
终于到周末啦!小易走在市区的街道上准备找朋友聚会,突然服务器发来警报,小易需要立即回公司修复这个紧急bug。假设市区是一个无限大的区域,每条街道假设坐标是(X,Y),小易当前在(0,0)街道,办公室在(gx,gy)街道上。小易周围有多个出租车打车点,小易赶去办公室有两种选择,一种就是走路去公司,另外一种就是走到一个出租车打车点,然后从打车点的位置坐出租车去公司。每次移动到相邻的街道(横向或者纵向)走路将会花费walkTime时间,打车将花费taxiTime时间。小易需要尽快赶到公司去,现在小易想知道他最快需要花费多少时间去公司。-
输入数据包括五行:
第一行为周围出租车打车点的个数n(1 ≤ n ≤ 50)
第二行为每个出租车打车点的横坐标tX[i] (-10000 ≤ tX[i] ≤ 10000)
第三行为每个出租车打车点的纵坐标tY[i] (-10000 ≤ tY[i] ≤ 10000)
第四行为办公室坐标gx,gy(-10000 ≤ gx,gy ≤ 10000),以空格分隔
第五行为走路时间walkTime(1 ≤ walkTime ≤ 1000)和taxiTime(1 ≤ taxiTime ≤ 1000),以空格分隔
-
题目分析:
咋一看以为很难,其实是简单题,直接枚举解决。1.要么坐车要么不坐车 2.坐车枚举坐车点就OK代码:
package WangYi2017Spring;
import java.util.Scanner;
public class HurryToBiz {
public final static int MAX = 50+5;
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n;
int[] tx = new int[MAX];
int[] ty = new int[MAX];
int gx,gy,walkTime,taxiTime;
while(sc.hasNext()){
n = sc.nextInt();
for(int i=0;i<n;i++){
tx[i] = sc.nextInt();
}
for(int i=0;i<n;i++){
ty[i] = sc.nextInt();
}
gx = sc.nextInt();
gy = sc.nextInt();
walkTime = sc.nextInt();
taxiTime = sc.nextInt();
int noTaxi = getDstn(0,0,gx,gy)*walkTime; //不搭的士
int taxi = Integer.MAX_VALUE;
for(int i=0;i<n;i++){
int temp = getDstn(0, 0, tx[i], ty[i])*walkTime + getDstn(tx[i], ty[i], gx, gy)*taxiTime;
if(taxi>temp)
taxi = temp;
}
System.out.println(noTaxi>taxi?taxi:noTaxi);
}
}
public static int getDstn(int x1,int y1,int x2,int y2){
return Math.abs(x2-x1)+Math.abs(y2-y1);
}
}