用户调度问题

用户调度问题

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

例如: 第一个用户使用A策略 则第二个用户只能使用B和C策略 对单的用户而言,不同的调度策略对系统资源的消耗可以规划后抽象为数值 例如 某用户分别使用ABC策略的系统消耗,分别为15 8 17 每个用户依次选择当前所能选择的对系统资源消耗最少的策略,局部最优 如果有多个满足要求的策略,选最后一个

输入描述:

  • 第一行表示用户个数N
  • 接下来表示每一行表示一个用户分别使用三个策略的资源消耗 resA resB resC

输出描述: 最优策略组合下的总的系统消耗资源数

看网上仅有的答案是贪心方式的,场景考虑不全。DP写了下,自己验了几组数据,不知道是否AC的,仅供参考:

public class 任务调度问题2_动态规划思路 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        while (sc.hasNext()) {
            int userNum = sc.nextInt();
            int[][] res = new int[userNum][3];
            for(int i=0;i<userNum;i++) {
                for(int j=0;j<3;j++) {
                    res[i][j] = sc.nextInt();
                }
            }
            jobDispatch(res,userNum);
        }
        sc.close();
    }

    public static void jobDispatch(int[][] res,int userNum) {
        // 使用二维数组保存状态:每个维度的含义分别是:[当前用户ID][所选的任务策略:A为0、B为1,、C为2],默认从下标1开始,所以是4
        int[][] dp = new int[userNum+1][4];
        for(int[] temp : dp) {
            Arrays.fill(temp,Integer.MAX_VALUE);
        }
        // result用来存放不同用户数量时的最小结果:比如result[0]就是只有一个用户时的最小消耗
        int[] result = new int[userNum];
        Arrays.fill(result,Integer.MAX_VALUE);
        // 边界值,初始化第一个用户选择各种策略的总消耗
        for(int index=1;index <= 3;index++) {
            dp[1][index] = res[0][index-1];
            result[0] = Math.min(result[0],dp[1][index]);
        }
        dp[0][0] = 0;

        // 因为前面用户选了某个策略,后面的用户就只能选不同的;所以对应了后面用户其实有三种选择情况
        // 所有用户都可以在前面的用户选择后递推出自己的最优消耗
        for(int i=2;i<=userNum;i++) {
            dp[i][1] = Math.min(dp[i-1][2],dp[i-1][3]) + res[i-1][0];
            dp[i][2] = Math.min(dp[i-1][1],dp[i-1][3]) + res[i-1][1];
            dp[i][3] = Math.min(dp[i-1][1],dp[i-1][2]) + res[i-1][2];
            result[i-1] = Math.min(result[i-1],Math.min(Math.min(dp[i][1],dp[i][2]),dp[i][3]));
        }
        System.out.println(result[userNum-1]);
    }

}
全部评论

相关推荐

乐观的打工人前程似锦:怎么说呢🤔️,学历够,专业技能看起来也有那么回事,就是项目会不会差点?dji更喜欢较为复杂的工程落地的项目吧?如果有一些title的项目就更好了。有实习也是加分项,搞过神经网络应该也是加分项。进面应该可以,还是要看技术过硬
点赞 评论 收藏
分享
2024-12-29 11:08
湖南工业大学 Java
程序员牛肉:简历没什么大问题了。 而且不要再换项目了。三月份就开暑期实习了,现在都一月份了。实在来不及重新开一下项目了。把一个项目写完或许很快,但是把一个项目搞懂吃透并不简单。所以不要换项目了,把你简历上面的两个项目好好挖一挖吧。 具体 体现在:你能不能流利的说出你的项目的每一个功能点代码实现?你能不能说出在这块除了A技术之外,还有其他技术能够实现嘛?如果有其他技术能够实现,那你这块为什么选择了你当前用的这个技术?
投递牛客等公司10个岗位
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务