B题题解
B题由于奇怪原因做崩了,虽然正确代码写出来了,但是不知错的那个为啥错了。
题目的思路,一言以蔽之:
一方面,某个数字出现前再次被拿上去时,从上一次拿上去(如果没有则是起始)开始到当前状态,中间的操作的数字一定会在当前操作花费代价的,且仅花费一次代价。
另一方面,将球的上下顺序按照拿出的最早时间依从早到晚使从上到下排序,即可构造出满足最小代价的初始排列。
//正确代码
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner ir=new Scanner(System.in);
int n=ir.nextInt();
int m=ir.nextInt();
long[] weight=new long[n];
for(int i=0;i<n;i++) {
weight[i]=ir.nextLong();
}
int[] op=new int[m];
for(int i=0;i<m;i++) {
op[i]=ir.nextInt()-1;
}
//读入完成
long ans=0;
for(int i=0;i<m;i++) {
Set<Integer> set=new HashSet<Integer>();
for(int j=i-1;j>=0&&op[j]!=op[i];j--) {
if(!set.contains(op[j])) {
ans+=weight[op[j]];
set.add(op[j]);
}
}
}
System.out.println(ans);
}
}但是为啥下边的代码是错误的?
下边的代码和上边仅仅只有一个ArrayList和数组的差别而已。
百思不得其解。求助!
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner ir=new Scanner(System.in);
int n=ir.nextInt();
int m=ir.nextInt();
long[] weight=new long[n];
for(int i=0;i<n;i++) {
weight[i]=ir.nextLong();
}
List<Integer> op=new ArrayList<Integer>();
for(int i=0;i<m;i++) {
op.add(ir.nextInt()-1);
}
long ans=0;
for(int i=0;i<m;i++) {
Set<Integer> set=new HashSet<Integer>();
for(int j=i-1;j>=0&&op.get(j)!=op.get(i);j--) {
if(!set.contains(op.get(j))) {
ans+=weight[op.get(j)];
set.add(op.get(j));
}
}
}
System.out.println(ans);
}
}
京公网安备 11010502036488号