No.3.7

No.3.7,第1张

一、题目描述:
  在通信系统中,一个常见的问题是对用户进行不同策略的调度,会得到不同的系统消耗和性能。假设当前有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();

        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[0][0] + " " + arr[0][1] + " " + arr[0][2]);
        System.out.println(arr[1][0] + " " + arr[1][1] + " " + arr[1][2]);
        System.out.println(arr[2][0] + " " + arr[2][1] + " " + arr[2][2]);

        recursion(arr, 0, temp, arr[0][0], 1);
        recursion(arr, 1, temp, arr[0][1], 1);
        recursion(arr, 2, temp, arr[0][2], 1);
        System.out.println(intSet.first());
        /**
        参考: 7 + 9 + 2 = 18
        	3
			16 7 23
			9 24 7
			10 9 2
			18
        */
    }

    /**
     * 递归方法遍历数组
     * @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);
        }
    }
}

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/723144.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-26
下一篇 2022-04-26

发表评论

登录后才能评论

评论列表(0条)

保存