当前位置: 首页 > news >正文

三国游戏(第十四届蓝桥杯)

题目

小蓝正在玩一款游戏。游戏中魏蜀吴三个国家各自拥有一定数量的士兵 X,Y,Z(一开始可以认为都为 0)。

游戏有 n个可能会发生的事件,每个事件之间相互独立且最多只会发生一次,当第 i个事件发生时会分别让 X,Y,Z
增加 A i , B i , C i A_i,B_i,C_i Ai,Bi,Ci

当游戏结束时 (所有事件的发生与否已经确定),如果 X,Y,Z的其中一个大于另外两个之和,我们认为其获胜。
例如,当 X>Y+Z时,我们认为魏国获胜。
小蓝想知道游戏结束时如果有其中一个国家获胜,最多发生了多少个事件?
如果不存在任何能让某国获胜的情况,请输出 −1。

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

输出格式
输出一行包含一个整数表示答案。

数据范围
对于 40%的评测用例,n≤500;
对于 70%的评测用例,n≤5000;
对于所有评测用例, 1 ≤ n ≤ 1 0 5 , 0 ≤ A i , B i , C i ≤ 1 0 9 1≤n≤10^5,0≤A_i,B_i,C_i≤10^9 1n1050Ai,Bi,Ci109
注意,蓝桥杯官方给出的关于 A i , B i , C i A_i,B_i,C_i Ai,Bi,Ci
的数据范围是 1 ≤ A i , B i , C i ≤ 1 0 9 1≤Ai,Bi,Ci≤10^9 1Ai,Bi,Ci109,但是这与给出的输入样例相矛盾,因此予以纠正。

输入样例:

3
1 2 2
2 3 2
1 0 7

输出样例:

2

样例解释

发生两个事件时,有两种不同的情况会出现获胜方。
发生 1,2 事件时蜀国获胜。
发生 1,3 事件时吴国获胜。

代码(python版本)

n=int(input())
def check(x,y,z)->int:w=[]for i in range(n):w.append(x[i]-y[i]-z[i])w.sort(reverse=True)res=-1sum=0for i in range(n):sum+=w[i]if sum>0:res=i+1return res
a=list(map(int,input().split()))
b=list(map(int,input().split()))
c=list(map(int,input().split()))
print(max(check(a,b,c),check(b,a,c),check(c,a,b)))

代码(cpp版本)

代码先欠着

思路:
本题是一道贪心题。当我一开始看这个题目的时候,首先想到的就是一道dfs题,但是当我看到数据范围为 1 0 5 10^5 105的时候我直接人傻,这还怎么dfs。于是换一个思路。
首先因为这个数据范围是 1 0 5 10^5 105,那么我们需要将时间复杂度控制在 n l o g n nlogn nlogn中。
本题要求的是一个国家打赢两个国家最多能发生多少次事件,看到最多,我就感觉是一道贪心题,那么怎么贪心呢?
首先我们需要想明白怎么贪?那我们可以先假设三个国家分别是ABC,然后我们假设 A > B + C A>B+C A>B+C,那么ABC到底是哪三个国家呢?这个直接可以枚举出来,A是魏蜀吴三个其中之一,剩下的B和C就是除了A以外的两个国家。
那么我们可以写一个函数来判断 A > B + C A>B+C A>B+C最多能要多少次
那么我们可以遍历ABC三个数组,然后用一个数组W来接受一下A国和B+C国的兵力差,也就是W[i]=A[i]-B[i]-C[i]的值,那么W[i]的含义是什么呢?很明显当W[i]>0的时候说明A的兵力比B+C的要多,这个事件我们当然要选。然后进行排序,接下来就是每次都获取到当前的兵力。然后用一个sum来记录,sum代表的是什么意思呢,就是A当前比B+C多sum个兵,然后我们依次进行遍历,sum不断累加W[i],当sum累加当前的兵力之后还是大于零,说明当前的事件容许发生,这时候就该让res++了。直到sum小于0的时候就不行了。
然后我们来看这个思路,整个的时间复杂度正好是 n l o g n nlogn nlogn(sort的时间复杂度)。
最后我们只需要调用上面的函数三次即可,也就是check(魏,蜀,吴),check(蜀,魏,吴),check(吴,蜀,魏),然后三者取最大值就行。

相关文章:

  • ros2学习笔记-CLI工具,记录命令对应操作。
  • 杭州城市开发者年会——CMeet系列技术生态沙龙
  • 【unity学习笔记】语音驱动blendershape
  • ctfshow反序列化(web254-web266)
  • 响应式Web开发项目教程(HTML5+CSS3+Bootstrap)第2版 例4-6 fieldset
  • HarmonyOS4.0系列——07、自定义组件的生命周期、路由以及路由传参
  • Spring:StopWatch
  • 用ChatGPT从英文文本中批量提取特定单词
  • 【OCR项目】之用HALCON的深度学习工具进行文字识别,并导出到C++调用
  • USB转SPI USB转IIC 串口转SPI串口转IIC SPI I2C模块
  • Android13预装APP到data分区
  • PDF有编辑密码怎么办
  • postman使用-07变量
  • R2DBC-响应式数据库
  • docker 安装mysql 并支持远程访问
  • 【comparator, comparable】小总结
  • CentOS7 安装JDK
  • input实现文字超出省略号功能
  • Java应用性能调优
  • JS数组方法汇总
  • Linux快速复制或删除大量小文件
  • PAT A1092
  • Protobuf3语言指南
  • SpiderData 2019年2月23日 DApp数据排行榜
  • Unix命令
  • webpack项目中使用grunt监听文件变动自动打包编译
  • 半理解系列--Promise的进化史
  • 程序员该如何有效的找工作?
  • 工作踩坑系列——https访问遇到“已阻止载入混合活动内容”
  • 开放才能进步!Angular和Wijmo一起走过的日子
  • 坑!为什么View.startAnimation不起作用?
  • 听说你叫Java(二)–Servlet请求
  • 学习JavaScript数据结构与算法 — 树
  • 延迟脚本的方式
  • #Lua:Lua调用C++生成的DLL库
  • (10)工业界推荐系统-小红书推荐场景及内部实践【排序模型的特征】
  • (HAL库版)freeRTOS移植STMF103
  • (附源码)springboot课程在线考试系统 毕业设计 655127
  • (欧拉)openEuler系统添加网卡文件配置流程、(欧拉)openEuler系统手动配置ipv6地址流程、(欧拉)openEuler系统网络管理说明
  • (篇九)MySQL常用内置函数
  • (十一)图像的罗伯特梯度锐化
  • (实战)静默dbca安装创建数据库 --参数说明+举例
  • (算法)N皇后问题
  • (五)Python 垃圾回收机制
  • (转)项目管理杂谈-我所期望的新人
  • ./和../以及/和~之间的区别
  • .netcore 6.0/7.0项目迁移至.netcore 8.0 注意事项
  • .NET平台开源项目速览(15)文档数据库RavenDB-介绍与初体验
  • [【JSON2WEB】 13 基于REST2SQL 和 Amis 的 SQL 查询分析器
  • [C#]C# winform实现imagecaption图像生成描述图文描述生成
  • [C++] 默认构造函数、参数化构造函数、拷贝构造函数、移动构造函数及其使用案例
  • [git] windows系统安装git教程和配置
  • [Golang]K-V存储引擎的学习 从零实现 (RoseDB mini版本)
  • [hive] 窗口函数 ROW_NUMBER()
  • [java] 23种设计模式之责任链模式