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