3.7_3 Java 练习题01 - 最优策略组合

相关链接


一、题目描述:
  在通信系统中,一个常见的问题是对用户进行不同策略的调度,会得到不同的系统消耗和性能。假设当前有n个待串行调度用户,每个用户可以使用A/B/C三种不同的策略,不同的策略会消耗不同的系统资源。请你根据如下规则进行用户调度,并返回总的消耗资源数。

二、规则:
  1.相邻的用户不能使用相同的调度策略,例如,第一个用户使用了策略A,则第二个用户只能使用B或者C策略。
  2.对单个用户而言,不同的调度策略对系统资源的消耗可以归一化为抽象数值。例如,某用户分别使用A/B/C的略的消耗分别为 15/8/17。
  3.每个用户依次选择当前所能选择的对系统资源消耗最少的策略(局部最优),如果有多个满足要求的策略,选最后一个。

三、输入描述:

第一行表述用户个数n
接下来每一行表示一个用户分别使用三个策略的系统消耗resA resB resC

四、输出描述:

最优策略组合下的总的系统资源消耗数

五、示例:

输入

3
15 8 17
12 20 9
11 7 5

输出

24

说明

1号用户使用B策略,2号用户使用C策略,3号用户使用B策略。系统资源消耗:8 + 9 + 7 = 24

六、输出描述:

所有策略对系统的资源消耗均为正整数,n<1000

参考结果:

package com.groupies.测试;

import java.util.Random;
import java.util.Scanner;
import java.util.TreeSet;

/**
 * @author GroupiesM
 * @date 2022/04/23
 * @introduction
 * 思路:TreeSet自动排序 + 二维数组递归方法
 * 这里用的生成随机数,提交答案时 r.nextInt(30) + 1 改为 in.nextInt() 即可,并且把打印的三行数据去掉
 */
public class test01 {
    static TreeSet<Integer> intSet = new TreeSet();
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int temp = in.nextInt();
        int[][] arr = new int[temp][3];
        Random r = new Random();
        
        System.out.println("-------------------");
        for (int i = 0; i < temp; i++) {
            arr[i][0] = r.nextInt(30) + 1;
            arr[i][1] = r.nextInt(30) + 1;
            arr[i][2] = r.nextInt(30) + 1;
            System.out.println(arr[i][0] + " " + arr[i][1] + " " + arr[i][2]);
        }
		//初始化TreeSet
        recursion(arr, 0, temp, arr[0][0], 1);
        recursion(arr, 1, temp, arr[0][1], 1);
        recursion(arr, 2, temp, arr[0][2], 1);
        //打印TreeSet中第一个值(最小值)
        System.out.println("-------------------");
        System.out.println(intSet.first());
/* 测试
	9
	-------------------
	7 15 14
	17 15 19
	7 20 26
	23 25 6
	8 27 25
	2 12 6
	6 30 22
	8 2 13
	17 1 26
	-------------------
	69
结果符合:7 + 15 + 7 + 6 + 8 + 6 + 6 + 2 + 13 + 1  = 69
*/
    }
 

    /**
     * 递归方法遍历数组
     * @param arr       数组
     * @param duplicate 上次出现的位置
     * @param leftCount 剩余递归次数
     * @param total 记录当前和
     * @param recursionCount 已递归次数
     * @return
     */
    public static void recursion(int[][] arr, int duplicate, int leftCount, int total, int recursionCount) {
        int left = leftCount - 1;
        if (left == 0) {
            intSet.add(total);
            return;
        }
        if (duplicate == 0) {
            recursion(arr, 1, left, total + arr[recursionCount][1], recursionCount + 1);
            recursion(arr, 2, left, total + arr[recursionCount][2], recursionCount + 1);
        } else if (duplicate == 1) {
            recursion(arr, 0, left, total + arr[recursionCount][0], recursionCount + 1);
            recursion(arr, 2, left, total + arr[recursionCount][2], recursionCount + 1);
        } else if (duplicate == 2) {
            recursion(arr, 0, left, total + arr[recursionCount][0], recursionCount + 1);
            recursion(arr, 1, left, total + arr[recursionCount][1], recursionCount + 1);
        }
    }
}

22/04/23

M

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值