题目 3158: 蓝桥杯2023年第十四届省赛真题-三国游戏(贪心)

题目描述

小蓝正在玩一款游戏。游戏中魏蜀吴三个国家各自拥有一定数量的士兵X, Y, Z (一开始可以认为都为 0 )。游戏有 n 个可能会发生的事件,每个事件之间相互独立且最多只会发生一次,当第 i 个事件发生时会分别让 X, Y, Z 增加Ai , Bi ,Ci 。
当游戏结束时 (所有事件的发生与否已经确定),如果 X, Y, Z 的其中一个大于另外两个之和,我们认为其获胜。例如,当 X > Y + Z 时,我们认为魏国获胜。小蓝想知道游戏结束时如果有其中一个国家获胜,最多发生了多少个事件?
如果不存在任何能让某国获胜的情况,请输出 −1 。

输入格式

输入的第一行包含一个整数 n 。
第二行包含 n 个整数表示 Ai,相邻整数之间使用一个空格分隔。
第三行包含 n 个整数表示 Bi,相邻整数之间使用一个空格分隔。
第四行包含 n 个整数表示 Ci,相邻整数之间使用一个空格分隔。

输出格式

输出一行包含一个整数表示答案。
样例输入
3
1 2 2
2 3 2
1 0 7
样例输出
2

解答

1.解题思路是,使用贪心思想选出三个国家各自获胜的最大事件数,取其最大作为答案;
那么如何算出一个国家士兵应该经历哪些事件并满足大于另外两国呢,同样使用贪心算法
2.我们使用一个类来存储一个事件,这个事件有abc三个属性,分别对应题目对三个国家兵力的提升

    static class node {
        long a, b, c;

        public node(long a, long b, long c) {
            this.a = a;
            this.b = b;
            this.c = c;
        }
    }

那么我们输入数据时需要注意一点,它的每一行都是对一个国家的影响,也就是对于事件i,输入的第一行数据是事件i的a,第二行数据才是事件i的b

    node[] events = new node[n];
    for (int i = 0; i < n; i++) events[i] = new node(sc.nextInt(), 0, 0); 
    for (int i = 0; i < n; i++) events[i].b = sc.nextInt();
    for (int i = 0; i < n; i++) events[i].c = sc.nextInt();

3.我们对事件进行排序,排序规则根据我们的需求而定,我们需要得出每个国家获胜的事件数,就把事件排序为对那个国家提升的兵力最多的事件最靠前
比如
1 2 2
2 3 2
1 0 7
事件i1对第一个国家提升量为-2,而i2提升量为-1,i3提升量为-7,则排序为i2i1i3
事件i1对第二个国家提升量为0,而i2提升量为1,i3提升量为-7,则排序为i2i1i3
事件i1对第三个国家提升量为-2,而i2提升量为-5,i3提升量为3,则排序为i3i1i2

  Arrays.sort(events, (o1, o2) -> o2.a - o2.b - o2.c + o1.b + o1.c - o1.a > 0 ? 1 : -1);
  Arrays.sort(events, (o1, o2) -> o2.b - o2.a - o2.c + o1.a + o1.c - o1.b > 0 ? 1 : -1);
  Arrays.sort(events, (o1, o2) -> o2.c - o2.a - o2.b + o1.a + o1.b - o1.c > 0 ? 1 : -1);

排序完之后使用排序后的顺序算出对应国家在最大优势的情况下可以经过几个事件并满足兵力大于其他两国

  Arrays.sort(events, (o1, o2) -> o2.a - o2.b - o2.c + o1.b + o1.c - o1.a > 0 ? 1 : -1);
  ans = Math.max(ans, f(events, 0));
  Arrays.sort(events, (o1, o2) -> o2.b - o2.a - o2.c + o1.a + o1.c - o1.b > 0 ? 1 : -1);
  ans = Math.max(ans, f(events, 1));
  Arrays.sort(events, (o1, o2) -> o2.c - o2.a - o2.b + o1.a + o1.b - o1.c > 0 ? 1 : -1);
  ans = Math.max(ans, f(events, 2));

这里使用一个数字标记当前优势国,而且如果你不能在第一个事件就大于其他两国,那么后面就更不可能了,所以不满足a>b+c时就直接break并返回事件数

     private static long f(node[] events, int cur) {
        long a = 0, b = 0, c = 0;
        long res = 0;
        for (int i = 0; i < events.length; i++) {
            a += events[i].a;
            b += events[i].b;
            c += events[i].c;
            if (cur == 0) {
                if (a > b + c) {
                    res = i + 1;
                } else {
                    break;
                }
            } else if (cur == 1) {
                if (b > a + c) {
                    res = i + 1;
                } else {
                    break;
                }
            } else {
                if (c > b + a) {
                    res = i + 1;
                } else {
                    break;
                }
            }
        }
        return res;
    }

4.最后打印答案,如果事件数为0,说明没有国家能够满足a>b+c的条件打印-1即可

System.out.println(ans == 0 ? -1 : ans);

完整代码


import java.util.Arrays;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        long ans = 0;
        node[] events = new node[n];
        for (int i = 0; i < n; i++) events[i] = new node(sc.nextInt(), 0, 0);
        for (int i = 0; i < n; i++) events[i].b = sc.nextInt();
        for (int i = 0; i < n; i++) events[i].c = sc.nextInt();
        Arrays.sort(events, (o1, o2) -> o2.a - o2.b - o2.c + o1.b + o1.c - o1.a > 0 ? 1 : -1);
        ans = Math.max(ans, f(events, 0));
        Arrays.sort(events, (o1, o2) -> o2.b - o2.a - o2.c + o1.a + o1.c - o1.b > 0 ? 1 : -1);
        ans = Math.max(ans, f(events, 1));
        Arrays.sort(events, (o1, o2) -> o2.c - o2.a - o2.b + o1.a + o1.b - o1.c > 0 ? 1 : -1);
        ans = Math.max(ans, f(events, 2));
        System.out.println(ans == 0 ? -1 : ans);
    }

    private static long f(node[] events, int cur) {
        long a = 0, b = 0, c = 0;
        long res = 0;
        for (int i = 0; i < events.length; i++) {
            a += events[i].a;
            b += events[i].b;
            c += events[i].c;
            if (cur == 0) {
                if (a > b + c) {
                    res = i + 1;
                } else {
                    break;
                }
            } else if (cur == 1) {
                if (b > a + c) {
                    res = i + 1;
                } else {
                    break;
                }
            } else {
                if (c > b + a) {
                    res = i + 1;
                } else {
                    break;
                }
            }
        }
        return res;
    }

    static class node {
        long a, b, c;

        public node(long a, long b, long c) {
            this.a = a;
            this.b = b;
            this.c = c;
        }
    }
}

原文链接:https://www.cnblogs.com/zhexian233/p/17362594.html

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:题目 3158: 蓝桥杯2023年第十四届省赛真题-三国游戏(贪心) - Python技术站

(0)
上一篇 2023年4月30日
下一篇 2023年5月4日

相关文章

  • 斜率优化入门

    前言 斜率优化是一种经典的单调队列优化类型,虽然它的名字很高大上,但是其思想内核非常简单,这篇博客就是用来帮助各位快速入门的 提示:本博客以单调队列的思想理解斜率优化 引入 dp 优化可以怎么分类? 数据结构维护决策点集的插入与查找 算法维护决策点集大小,取出无用决策点 而斜率优化 dp 属于第二者,且常常用于优化序列分割问题 Q1 P3195 A1 先列出…

    算法与数据结构 2023年4月17日
    00
  • python人工智能算法之决策树流程示例详解

    Python人工智能算法之决策树流程示例详解 决策树是一种常用的分类和回归算法,它可以用于解决各种问题例如预测、分类和聚类等。在Python中,我们可以使用Scikit-learn库来实现决策树算法。本文将详细讲解Python中决策树算法的流程,包括数据预处理、模型训练和模型评估等。 数据预处理 在使用决策树算法之前,我们需要对数据进行预处理。数据预处理包括…

    python 2023年5月14日
    00
  • python自动分箱,计算woe,iv的实例代码

    自动分箱、计算WOE和IV是数据预处理中常用的技术,可以帮助我们更好地理解数据,提高模型的预测能力。在本攻略中,我们将介绍如何使用Python实现自动分箱、计算WOE和IV的过程。 1. 数据准备 首先,我们需要准备一份数据集。在本攻略中,我们将使用一个名为“credit”的数据集,其中包含了一些客户的个人信息和信用评分。我们的目标是根据这些信息预测客户的信…

    python 2023年5月14日
    00
  • Go语言数据结构之选择排序示例详解

    Go语言数据结构之选择排序示例详解 什么是选择排序? 选择排序是一种简单的排序算法,它的基本思想是在待排序的数列中选择一个最小(或最大)的元素放到最前面,再在剩下的数列中选择一个最小(或最大)的元素放到已排序序列的末尾,以此类推,直到所有的元素都排序完毕。 其排序的时间复杂度为O(N²),在数据量较小的情况下使用起来非常方便。 选择排序的实现 下面我们来看一…

    数据结构 2023年5月17日
    00
  • EMI/EMS/EMC有什么关系?

    EMI(Electromagnetic Interference)直译是“电磁干扰”,是指电子设备(即干扰源)通过电磁波对其他电子设备产生干扰的现象。 从“攻击”方式上看,EMI主要有两种类型:传导干扰和辐射干扰。 电磁传导干扰是指干扰源通过导电介质(例如电线)把自身电网络上的信号耦合到另一个电网络。 电磁辐射干扰往往被我们简称为电磁辐射,它是指干扰源通过空…

    算法与数据结构 2023年4月17日
    00
  • Python实现约瑟夫环问题的方法

    下面是详细讲解“Python实现约瑟夫环问题的方法”的完整攻略。 1. 什么是约瑟夫环问题 约瑟夫环问题是一个经典的数学问题,它的故事起源于代约瑟夫斯的传说。问题描述如下:有n个人围成一圈,从第一个人开始报数,报到m的人出,然后从出圈的下一个人开始重新报数,直到剩下最后一个人。问后剩下的人是谁? 2. 实现约瑟夫环问题 以下是用Python实现约瑟问题的步骤…

    python 2023年5月14日
    00
  • Python中的函数式编程:不可变的数据结构

    Python是一门支持函数式编程的语言。相比于传统的命令式编程,函数式编程更加强调数据的不可变性。本文将介绍如何在Python中使用不可变的数据结构实现函数式编程。 什么是不可变的数据结构? 不可变数据结构是指一旦创建就无法改变的数据结构。在Python中,元组(tuple)是一个典型的不可变数据结构。以下是一个创建元组的示例代码: a_tuple = (1…

    数据结构 2023年5月17日
    00
  • 数据结构C语言链表的实现介绍

    数据结构C语言链表的实现介绍 1. 什么是链表? 链表是一种常见的数据结构,它由一系列的节点(Node)通过链接(Link)组成,每个节点包含两个部分:数据域(Data)和指针(Pointer),数据域用来存储数据,指针用来链接下一个节点。链表最重要的优点就是支持动态扩展,占用内存比较灵活,相比于数组,链表在增加和删除元素时更加高效。 2. 链表的实现 链表…

    数据结构 2023年5月17日
    00
合作推广
合作推广
分享本页
返回顶部