第一行输入一个整数
,表示药剂种类数量。
第二行输入
个整数
,依次表示直接购买一瓶第
种红色药剂的价格。
接下来
行,第
行输入两个整数
,表示合成蓝色版本第
种药剂所需的两种红色药剂的编号。
输出一个整数,表示获得
种不同药剂所需支付的最小金币数。
5 2 4 10 1 3 2 3 4 5 1 2 2 5 1 4
16
一种最优方案:
直接购买第
种红色药剂,花费
;
利用红色的
调配得到第
种蓝色药剂,花费
;
最终花费
,满足拥有
的不同药剂。
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int n = in.nextInt();
in.nextLine();
String[] redMedStr = in.nextLine().split(" ");
int[] redMeds = new int[redMedStr.length];
for (int i = 0; i < redMeds.length; i++) {
redMeds[i] = Integer.parseInt(redMedStr[i]);
}
int sum = 0;
for (int i = 0; i < n; i++) {
int b = in.nextInt();
int c = in.nextInt();
int blueMed = redMeds[b-1] + redMeds[c-1];
int redMed = redMeds[i];
sum += Math.min(blueMed, redMed);
}
System.out.println(sum);
}
} ''' 注意:调配后的试剂颜色为蓝色不能再使用 若调配的价格更低,直接使用调配的价格替换原列表中红色实际价格,得出的结果更小 因为替换后的蓝色试剂价格可能会被再次引用,来计算调配价格,但因时蓝色试剂,故不能再被引用 故需要再新建列表用来存储调配后的价格,再比较两个列表,进而获取最小值 ''' n = int(input()) red = [int(x) for x in input().split()] blue = [] result = 0 for i in range(n): b, c = map(int, input().split()) blue.append(red[b-1] + red[c-1]) for i in range(n): result += min(blue[i],red[i]) print(result)
import java.util.Scanner;
// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int n = in.nextInt();
int[] prr = new int[n];
int count =0;
for(int i=0; i<n; i++){
prr[i] = in.nextInt();
}
int[] prb = new int[n];
for( int i =0; i<n; i++){
prb[i] = prr[in.nextInt()-1] + prr[in.nextInt()-1];
// System.out.println(prb[i]);
}
for(int i=0; i<n; i++){
if(prr[i] < prb[i]){
count = count +prr[i];// 直接购买
}else{
count = count + prb[i];//合成
}
}
System.out.println(count);
}
}