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); } }