歌手与小朋友照相 【贪心】

可紊 提交于 2019-12-02 15:00:26

在这里插入图片描述

 Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int s = sc.nextInt();
        int index = 0;
        int num = 0;
        int[][] x = new int[n][2];
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < 2; j++) {
                x[i][j] = sc.nextInt();
            }
        }

        for (int i = 0; i < n; i++) {
            if (s  < x[i][1]) { //如果这一位不满足
                if(i!=n-1) { // 如果不是最后一位
                    if (s  >= x[i + 1][1]) { //判断是否大于所需要的积木数
                        s = (s - x[i + 1][1]) + x[i + 1][0] + x[i + 1][1]; // 给小朋友,然后拿到所有积木
                        index++; // 拍照+1
                    }
                }
            }
        }
        int len = n-index; // 减去已经拍过照的
        for (int i = 0; i < len; i++) { // 回溯
            if (s  < x[i][1]) { // 判断是否小于当前需要的积木数
                if(i!=len-1) { // 判断是否是最后一位
                    if (s  >= x[i + 1][1]) { // 判断是否大于下一位的积木数
                        s = (s - x[i + 1][1]) + x[i + 1][0] + x[i + 1][1]; // 拿到所有积木
                        num++; // 个数+1
                    }
                }
            }else { // 否则
                s = (s - x[i][1]) + x[i ][0] + x[i ][1]; //直接拿到所有积木数
                num++; // 个数+1
            }
        }
        System.out.println(index+num); // 输出所有

    }
}

总结,贪心算法就是求局部的最优解,每当当前解集不满足我们所需要的解时,跳过整个解集,转而去找其他的条件,判断是否满足我们所需要的解,再一步一步回溯。

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!