OJ-0829

题目

在这里插入图片描述
示例1

输入:
5 4
1
1
2
3
5
1 2 3
1 4
3 4 5
2 3 4
输出:
3
4
1
2

说明:测试用例的优先级计算如下:
T1=Pf1+Pf2+Pf3=1+1+2=4
T2=Pf1+Pf4=1+3=4
T3=Pf3+Pf4+Pf5=2+3+5=10
T4=Pf2+Pf3+Pf4=1+2+3=6
按照优先级从小到大,以及相同优先级,ID小的先执行的规则,执行顺序为T3,T4,T1,T2

示例2

输入:
3 3
3
1
5
1 2 3
1 2 3
1 2 3
输出:
1
2
3

说明:测试用例的优先级计算如下:
T1=Pf1+Pf2+PF3=3+1+5=9
T2=Pf1+Pf2+PF3=3+1+5=9
T3=Pf1+Pf2+PF3=3+1+5=9
每个优先级一样,按照ID从小到大执行,执行顺序为T1,T2,T3

题解

import java.util.PriorityQueue;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int n = in.nextInt();
        int m = in.nextInt();
        int[] f = new int[n];
        for (int i = 0; i < n; i++) {
            f[i] = in.nextInt();
        }
        in.nextLine();
        PriorityQueue<Test> tests = new PriorityQueue<>((o1, o2) -> o1.pri == o2.pri ? o1.id - o2.id : o2.pri - o1.pri);
        for (int i = 0; i < m; i++) {
            String[] ts = in.nextLine().split(" ");
            int pri = 0;
            for (String s : ts) {
                pri += f[Integer.parseInt(s) - 1];
            }
            tests.add(new Test(i + 1, pri));
        }
        while (!tests.isEmpty()) {
            System.out.println(tests.poll().id);
        }
    }

    static class Test {
        int id;
        int pri;

        public Test(int id, int pri) {
            this.id = id;
            this.pri = pri;
        }
    }
}

参考

import java.util.*;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);  // 创建Scanner对象用于接收输入
        int n = sc.nextInt();  // 读取输入的整数n
        int m = sc.nextInt();  // 读取输入的整数m
        int[] a = new int[n + 1];  // 创建整数数组a,长度为n+1
        for (int i = 1; i <= n; i++)
            a[i] = sc.nextInt();  // 读取n个整数并存入数组a
        List<Integer>[] list = new ArrayList[m];  // 创建整数列表的数组list,长度为m
        for (int i = 0; i < m; i++)
            list[i] = new ArrayList<>();  // 初始化数组list的每个元素为一个空的整数列表
        sc.nextLine();  // 读取换行符,准备读取下一行输入
        for (int i = 0; i < m; i++) {
            String s = sc.nextLine();  // 读取一行字符串
            int[] arr = Arrays.stream(s.split(" ")).mapToInt(Integer::parseInt).toArray();  // 将字符串按空格分割并转为整数数组
            for (int j = 0; j < arr.length; j++)
                arr[j] = a[arr[j]];  // 将整数数组arr中的每个元素替换为数组a中对应索引的值
            int sum = Arrays.stream(arr).sum();  // 计算整数数组arr的和
            list[i].add(sum);  // 将和添加到数组list的第i个元素中
            list[i].add(i + 1);  // 将i+1添加到数组list的第i个元素中
        }
        Arrays.sort(list, (o1, o2) -> {  // 对数组list进行排序
            if (o1.get(0) != o2.get(0))
                return o2.get(0) - o1.get(0);
            return o1.get(1) - o2.get(1);
        });
        for (int i = 0; i < m; i++)
            System.out.println(list[i].get(list[i].size() - 1));  // 输出数组list的第i个元素的最后一个值
    }
}

https://blog.csdn.net/weixin_52908342/article/details/135415370

  • 7
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值