题目 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日

相关文章

  • 数据结构与算法大作业:走迷宫程序(C语言,DFS)(代码以及思路)

    好家伙,写大作业,本篇为代码的思路讲解   1.大作业要求 走迷宫程序 问题描述: 以一个 m * n 的长方阵表示迷宫, 0和1分别表示迷宫的通路和障碍。 设计一个程序, 对任意设定的迷宫, 求出一条从入口到出口的通路, 或得出没有通路的结论。 基本要求: (1) 实现一个以链表做存储的栈类型, 然后编写一个求解迷宫的非递归程序。 求的通路以三元组(i, …

    算法与数据结构 2023年5月9日
    00
  • Python实现最短路径问题的方法

    最短路径问题是计算机科学中的一个经典问题,它的目标是在一个加权图中找到两个节点之间的最短路径。在Python中,我们可以使用Dijkstra算法和Bellman-Ford算法来解决最短路径问题。 Dijkstra算法 Dijkstra算法是一种贪心算法,它的基本思想是从起点,每次选择距离起点最近的节点,并更新与该节点相邻的节点的距离。在Python中,我们可…

    python 2023年5月14日
    00
  • JavaScript数据结构与算法

    JavaScript数据结构与算法完整攻略 什么是数据结构与算法 数据结构和算法是计算机科学的重要组成部分,常用于解决数据处理问题的方法与技术。数据结构是指存储和组织数据的方式,而算法则是解决数据处理问题的途径和方法。 数据结构分类 数据结构可分为以下几类: 数组 —— 存储有序元素集合的线性结构; 栈 —— 一种后进先出的数据结构; 队列 —— 一种先进先…

    数据结构 2023年5月17日
    00
  • java数据结构基础:算法

    Java数据结构基础:算法攻略 概述 在程序员的日常开发中,算法是一项重要的技能,而数据结构则是算法不可缺少的基础。本文将讲解Java数据结构中的基本算法,包括常见算法的实现,算法的分析及算法的运用。经过本文的学习,读者可以掌握Java中基础的算法实现及应用。 常见算法实现 排序算法 排序算法是算法中最基础的一类,常用的算法有冒泡排序、插入排序、选择排序、快…

    数据结构 2023年5月17日
    00
  • Java数据结构之有向图的拓扑排序详解

    下面我将为您详细讲解“Java数据结构之有向图的拓扑排序详解”的完整攻略。 拓扑排序概述 拓扑排序是一种常见的有向无环图(DAG)的排序方法,该算法将DAG图中所有节点排序成一个线性序列,并且使得所有的依赖关系都满足从前向后的顺序关系。一般来说,DAG图的所有节点可以表示为一个任务依赖关系,而拓扑排序则可以对这些任务进行排序,确保每个任务在它所依赖的任务之后…

    数据结构 2023年5月17日
    00
  • Python数据结构与算法之图结构(Graph)实例分析

    下面是关于“Python数据结构与算法之图结构(Graph)实例分析”的完整攻略。 1. 图结构的基本概念 图结构是由节点和边组成的一种数据结构,它可以用来表示各种实体之间的关系。在图结构中,节点表示实体,边表示实体之间的关系。图结构可以分为有向图和无向图两种类型。在有向图中,边有方向,表示一个节点到另一个节点的单向关系;在无向图中,边没有方向,表示两个节点…

    python 2023年5月13日
    00
  • python的数学算法函数及公式用法

    以下是关于“Python的数学算法函数及公式用法”的完整攻略: 简介 Python是一种强大的编程语言,它提供了许多数学算法函数和公式,可以用于解决各种数学问题。在本教程中,我们将介绍Python中常用的数学算法函数和公式,包括数学函数、线性代数、微积分、概率统计等。 数学函数 Python中常用的数学函数包括: abs(x):返回x的绝对值。 pow(x,…

    python 2023年5月14日
    00
  • Python数据结构之Array用法实例

    Python数据结构之Array用法实例 在Python中,Array是一种很有用的数据结构类型。它可以通过简单的方式存储一系列数据,提供快速的索引访问和高效的操作。本文将详细探讨Python中Array的用法,包括创建Array、插入、删除、修改、查找和遍历等。 创建Array 要创建一个Array,需要使用array模块。在调用前,需要首先导入该模块。A…

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