作者主页:Designer 小郑
作者简介:Java全栈软件工程师一枚,来自浙江宁波,负责开发管理公司OA项目,专注软件前后端开发(Vue、SpringBoot和微信小程序)、系统定制、远程技术指导。CSDN学院、蓝桥云课认证讲师,全栈领域优质创作者,在校期间参加PAT乙级考试获得满分,三年ACM竞赛经验,斩获国奖两项,省奖五项。热爱技术、专注业务、开放合作、乐于分享,期待你我共同成长!
主打方向:Vue、SpringBoot、微信小程序

题目链接:题目链接

题面:

小王再次体验太空弹簧后,还是觉得飞机好玩,于是又来到了太空飞机场,想开着飞机遨游太空。

小张看到小王对太空飞机场如此感兴趣,于是命令手下将飞机场调整成了环形的一个有序圈,圈的周长为 N(1 < N < 5000),也就是说一圈有 N 个飞机位,让小王玩得痛快。

这些临时排列的飞机场,每个飞机位都放有一张卡牌,卡牌上有个数 M(-5000 < N < 5000),飞机飞到这个飞机位后,必须翻开这张卡牌,自己的积分加上这个数。

小王的飞机可以从九点钟开始,任意选一个飞机场作为启点,顺时针方向驾驶飞机,必须逐个停留每个飞机位,不得跨越,终点设为九点钟方向往南的第一个飞机位,飞机位编号如图所示。

游戏开始之前小王已经知道了每个飞机位的卡牌值,请问小王如何飞行才能让自己的积分最大化

引用说明:以上图片来自于蓝桥云课。

知识点

  • 最大子数组和
  • 动态规划

初始代码

public class HMain {public static List<Integer> doWork(List<Integer> inputList) {List<Integer> ansObj = new ArrayList<>();// 最大积分值int max = -999;// 起始飞机位int k = 0;// 终止飞机位int l = 0;//代码编辑区 开始//代码编辑区 结束ansObj.add(max);ansObj.add(k);ansObj.add(l);return ansObj;}public static void main(String[] args) {//测试用例System.out.println((Objects.equals(Arrays.asList(8,3,6),doWork(Arrays.asList(1,-2,3,4,-5,6,-7))) ? "【√正确】" : "【X错误】 ") + "圈卡片值:1,-2,3,4,-5,6,-7,答案:" + doWork(Arrays.asList(1,-2,3,4,-5,6,-7)));System.out.println((Objects.equals(Arrays.asList(21,5,7),doWork(Arrays.asList(5,6,8,-99,7,7,7))) ? "【√正确】" : "【X错误】 ") + "圈卡片值:5,6,-1,5,4,-7,答案:" + doWork(Arrays.asList(5,6,8,-99,7,7,7)));}
}

样例说明

输入数据是一个整数数组 A,代表飞机场从九点钟方向开始,顺时针逐个飞机位的卡片值,数组长度不超过 5000,数组数据项的绝对值不超过 5000。

题目需要返回三个数 max(小王最高可获得的积分)、k(起始位置)、l(终止位置)。

题解

考察对动态规划的理解。九点钟方向顺时针一圈,可以理解为一条直线,卡片值也就是一个一维数组。

状态转移方程为 dp[i] = dp[i] + dp[i-1],若 dp[i-1] 大于 0 则说明前面的积分可以延续采用。

若小于 0 则放弃前面的积分,从 0 积分重新开始,并更新起始位置。

参考代码如下:

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Objects;public class HAns {private final static Integer[] ans = new Integer[6000];public static List<Integer> doWork(List<Integer> inputList) {List<Integer> ansObj = new ArrayList<>();// 最大积分值int max = -999;// 起始飞机位int k = 0;// 终止飞机位int l = 0;//代码编辑区 开始int n = inputList.size();List<Integer> numberList = new ArrayList<>();numberList.add(0);numberList.addAll(inputList);for(int i = 0; i < 6000; i ++) {ans[i] = 0;}for(int i = 1; i <= n; i ++) {ans[i] = Math.max(numberList.get(i), ans[i - 1] + numberList.get(i));if (ans[i] > max) {max = ans[i];l = i;}}int sum = 0;for (int i = l; i > 0; i--) {sum += numberList.get(i);if (sum == max) {k = i;}}//代码编辑区 结束ansObj.add(max);ansObj.add(k);ansObj.add(l);return ansObj;}public static void main(String[] args) {//测试用例System.out.println((Objects.equals(Arrays.asList(8,3,6),doWork(Arrays.asList(1,-2,3,4,-5,6,-7))) ? "【√正确】" : "【X错误】 ") + "圈卡片值:1,-2,3,4,-5,6,-7,答案:" + doWork(Arrays.asList(1,-2,3,4,-5,6,-7)));System.out.println((Objects.equals(Arrays.asList(21,5,7),doWork(Arrays.asList(5,6,8,-99,7,7,7))) ? "【√正确】" : "【X错误】 ") + "圈卡片值:5,6,8,-99,7,7,7,答案:" + doWork(Arrays.asList(5,6,8,-99,7,7,7)));}
}

总结

要 AC 本题,必须学会最大子数组和动态规划的算法,尽可能的获取卡片,以获取最高的积分,最终通过本题。

华硕编程竞赛11月JAVA专场 G题飞行棋 题解相关推荐

  1. 华硕编程竞赛11月JAVA专场 A题自由弹簧 题解

    作者主页:Designer 小郑 作者简介:软件工程师一枚,来自浙江宁波,负责开发管理公司OA项目,专注软件前后端开发(Vue.SpringBoot和微信小程序).系统定制.远程技术指导.CSDN学院 ...

  2. 华硕编程竞赛11月JAVA专场 C题太空遨游 题解

    作者主页:Designer 小郑 作者简介:Java全栈软件工程师一枚,来自浙江宁波,负责开发管理公司OA项目,专注软件前后端开发(Vue.SpringBoot和微信小程序).系统定制.远程技术指导. ...

  3. 华硕编程竞赛11月JAVA专场 D题飞机大战 题解

    作者主页:Designer 小郑 作者简介:Java全栈软件工程师一枚,来自浙江宁波,负责开发管理公司OA项目,专注软件前后端开发(Vue.SpringBoot和微信小程序).系统定制.远程技术指导. ...

  4. 华硕编程竞赛11月JAVA专场 B题召唤精灵 题解

    作者主页:Designer 小郑 作者简介:软件工程师一枚,来自浙江宁波,负责开发管理公司OA项目,专注软件前后端开发(Vue.SpringBoot和微信小程序).系统定制.远程技术指导.CSDN学院 ...

  5. 华硕编程竞赛11月JAVA专场 J题再见天空 题解

    作者主页:Designer 小郑 作者简介:Java全栈软件工程师一枚,来自浙江宁波,负责开发管理公司OA项目,专注软件前后端开发(Vue.SpringBoot和微信小程序).系统定制.远程技术指导. ...

  6. 5_竞赛无人机搭积木式编程——以2021年电赛G题植保无人机国奖标准完整复现为例学习

    竞赛无人机搭积木式编程 --以2021年电赛G题植保无人机国奖标准完整复现为例学习 首先我们需要了解下自动飞行任务执行过程几组关键变量的用法与实际作用效果: flight_subtask_cnt用于控 ...

  7. 关于517编程的11月月赛

    关于517编程的11月月赛-Nov.29 by Jasonxu 我是传送门 T1:umin之和 1.1题目 小海狸定义 umin为最小的没有在子集中出现过的非负整数. 小海狸有一组非负整数,他希望将这 ...

  8. 2020年第十一届蓝桥杯决赛JAVA B G题“皮亚诺曲线距离“

    2020年第十一届蓝桥杯决赛JAVA B G题"皮亚诺曲线距离" 2020国赛 JAVA B组 个人题解目录 [问题描述] 皮亚诺曲线是一条平面内的曲线. 下图给出了皮亚诺曲线的 ...

  9. 2020年11月软件设计师真题透析

    2020年下半年软件设计师上午真题及答案解析 1.在程序执行过程中,高速缓存(Cache)  与主存间的地址映射由(   ). A. 操作系统进行管理 B. 操作系统进行管理 C.    程序员自行安 ...

最新文章

  1. 一个简单案例,带你看懂GC日志!
  2. Gradle 编译速度提升 70%!怎么做到的?
  3. 用 Python+openpose 实现抖音尬舞机
  4. java里面自行车的属性_11、Java基础知识
  5. WPF 绑定StaticResource到控件的方法
  6. 【utorrent】ubuntu 安装utorrent
  7. 有效利用番茄工作法提高效率--XorTime的使用方法
  8. API激光跟踪仪SDK基础使用
  9. 微信红包最多能发多少钱?微信红包200元上限解除
  10. 蓝宝石(Al2O3)晶体基片
  11. 计算机课程老师讲什么初中,初中计算机老师的教学工作总结
  12. k8s集群svc端口范围,nfs做StorageClass运行故障
  13. No enclosing instance of type E is accessible. Must qualify the allocation with an enclosing instanc
  14. 前端开发常见的英语词汇
  15. 淘淘商城第86讲——实现商品详情页面静态化方案时,你没遇到过java.lang.IllegalArgumentException或者java.lang.NullPointerException这种异常
  16. 盗取QQ密码的Trojan.PSW.QQPass.rky正通过QQ信息中的网址传播
  17. 面向祖传代码 Debug,我挽回了一位准备跑路的程序员
  18. 139邮箱 push mail
  19. 用英文写电子邮件的常用句式
  20. 【Unicode】字符编码表信息

热门文章

  1. 孔子最得意的弟子颜回不幸英年早逝
  2. 数据系统读写权衡的一知半解
  3. amule mldonkey
  4. JAVA 基础学习第一天
  5. 什么是视频价值?如何体现价值?做自媒体有很多人都弄错了
  6. c语言中-1 ind,ind c是什么意思
  7. foldermove中文版下载 | FolderMove(电脑文件夹移动软件)单文件汉化版V3.0.0.0 | 最新版foldermove下载
  8. NLP - 词的表示:Bow,One-hot, TF-IDF,Word2VNLP
  9. Python+CLIP,令人惊叹的个性艺术表达
  10. matlab画简单长方形,matlab在图像中画长方形(框)