1、用户模型文件去重。

抖音上不同的用户类型我们有不同的用户模型文件。我们有一个模型配置文件,里面有很多的不同用户类型和他们对应的模型文件。我们需要找出每个模型文件对应的是哪些用户类型。

给定一行输入,格式为:

a b

a表示这个用户的用户类型,b表示这个用户对应的模型文件。请你输出每个模型文件对应的用户类型。

注意:每个模型文件可能对应多个用户类型,用户类型之间用空格作为切分。

注意2:如果有多个用户类型输出,用户类型之间的排序按照字母表排序。

eg:

输入:

1

abc 1.txt

输出如下:

1.txt abc

public class test020 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int lineNum = sc.nextInt();sc.nextLine();
        Map<String, Set<String>> map =  new TreeMap<>();
        for(int i=0; i<lineNum; i++){
            String[] line = sc.nextLine().trim().split(" ");
            if(map.containsKey(line [1])){
                map.get(line[1]).add(line[0]);
            }else {
                Set<String> set = new TreeSet<>();
                set.add(line[0]);
                map.put(line[1], set);
            }
        }

        for(Map.Entry<String, Set<String>> entry: map.entrySet()){
            Set<String> set = entry.getValue();
            List<String> strings = new ArrayList<>(set);
//            Collections.sort(strings);

            System.out.print(entry.getKey()+" ");
            for(String s: strings) System.out.print(s+" ");
            System.out.println();

        }
    }
}

2、 贪心算法,补给饮用水
假设你要从0点开始沙漠旅行到终点D,总共D个站点,每走一公里消耗一升的水量,初始携带的水量为W,但是在路途中是可以补给到一些水的,这些站点的位置在pos数组中给出,在sup数组的对应位置给出了在站点能获得的水量多少。即:在pos[i] 站点能获得的水量为sup[i],现在要求最少需要加多少次水,如果在路途中会被渴死,直接返回-1

public class test021 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int D = sc.nextInt();
        int W = sc.nextInt();
        int[] pos = new int[3];
        int[] sup = new int[3];
        for(int i=0; i<3; i++){
            pos[i] = sc.nextInt();
        }
        for(int i=0; i<3; i++){
            sup[i] = sc.nextInt();
        }
        System.out.print(D+" ");
        System.out.print(W);
        System.out.println();
        for (int j=0; j<3; j++){
            System.out.print(pos[j]+" ");
        }
        System.out.println();
        for (int k=0; k<3; k++){
            System.out.print(sup[k]+" ");
        }
        System.out.println();
        int res = solve(D, W, pos, sup);
        System.out.println("次数最少为:"+res+"次");
    }

    public static int solve(int D, int W, int[] pos, int[] sup){
        int res = 0;

        // 用来指示在特定的水站有没有取过水,一个水站只能取一次水
        boolean[] used = new boolean[pos.length];

        // 旅行者现在所在的位置
        int curPos = 0;

        while (curPos<D){
            // 每次直接跳到能够着的最大位置,携带的水也会被喝光
            curPos+=W;
            W = 0;
            // 如果已经到达终点,则直接返回加了多少次水
            if(curPos>=D) return res;

            // 标记一下能获得最多水的水站在pos中的下标
            int maxIndex = -1;

            for(int i=0;i<pos.length;i++){
                // 当前还没到指定的水站,则不能从这些水站取水,直接break
                if(pos[i]>curPos) break;
                // 如果还没从该水站取水,则会看在这里取水能否得到最大的水量
                if(!used[i] && sup[i]>W) {
                    W = sup[i]; maxIndex = i;
                    System.out.println("W="+W);
                    System.out.println("maxIndex="+maxIndex);
                }
            }

            // 没水了,而且也没有水站可以取水,可能在路途上被渴死
            if(maxIndex==-1) return -1;

            used[maxIndex] = true;
            res++;
        }
        return res;
    }
}