问题描述
  娜娜是一个特别可爱的女孩子,作为学神的她最近在情感方面出现了一点点小问题。
  她暗恋的琦琦是一名学霸,他只喜欢长得漂亮和学习很好的女生。
  娜娜学习确实很神,但是她在琦琦面前却总是表现不出平时的神力。
  琦琦感受到了娜娜对他的爱,但是他还是觉得娜娜的学习并不是特别好,于是他出了一道题给娜娜。
  “娜娜,我们之间的关系需要在不断深入的同时保持一定的平衡,不可以你总是强势或者我总是弱势。”
  琦琦给了娜娜一些两两不等的数,希望娜娜能把这些数分成两组A和B,满足以下条件:
  1:每一次只能操作一个数,即只取出一个数分入A中或B中;
  2:每一次操作完成后,A中数之和与B中数之和的差不能超过r。
  新时代的丘比特们啊,帮帮娜娜吧!
输入格式
  输入共两行。
  第一行包括两个正整数n和r,n表示琦琦一共给了n个数,r的意义见题目描述。
  第二行包括n个正整数,分别表示琦琦给的n个数。
输出格式
  输出共两行,分别把A与B两组数按从小到大输出。
  注意输入中n个数的第一个必须分入A组。
  琦琦保证这样的输出唯一。
样例输入
4 10
9 6 4 20
样例输出
4 6 9
20
样例说明
  先把4和6先后分入A组,再把20分入B组,最后把9分入A组。
数据规模和约定
  很小,真的很小。
——————————————————————————————————————————
题目思路:采用DFS搜索算法,题目要求一次放一个,始终保持A组的和减去B组的和的绝对值小于r。先往A一次一次地放符合条件的元素,直到不满足条件,然后往B里面放一个满足条件的元素,然后又去往A中一次一次地放元素,直到不满足条件,一直重复。注意题目n个数的第一个必须分入A组,所以如果第一个元素不满足题目条件,应该先往B放,加个判断条件即可。


import java.util.Arrays;
import java.util.Scanner;public class Main {static int N;// 数据的总个数static int R;// 相差不能超过Rstatic int[] A;// A存放元素的数组static int[] B;// B存放元素的数组static int[] vis;// 数据被使用的状态static int a = 0;// A的元素static int b = 0;// B的元素static int flag = 0;// 结束标志,题目告知答案唯一,所以找到答案后就结束。public static void main(String[] args) {Scanner scanner = new Scanner(System.in);int n = scanner.nextInt();N = n;vis = new int[n];int r = scanner.nextInt();R = r;A = new int[n];B = new int[n];int[] arr = new int[n];for (int i = 0; i < n; i++) {arr[i] = scanner.nextInt();}DFS(arr, 1);}// 求和public static int sum(int[] num) {int sum = 0;for (int x : num) {sum += x;}return sum;}// 深度搜索public static void DFS(int[] arr, int step) {if (Math.abs(sum(A) - sum(B)) > R) {// 不符合题目条件的直接返回结束return;}if (step > N) {// 找到答案// 对A、B数组进行从小到大的排序Arrays.sort(A, 0, a - 1);Arrays.sort(B, 0, b - 1);// 输出结果for (int i = 0; i < a; i++) {System.out.print(A[i] + " ");}System.out.println();for (int i = 0; i < b; i++) {System.out.print(B[i] + " ");}flag = 1;// 修改结束标志return;}// 先往A里面放元素,直到放进A不满足条件 A-B的绝对值<rfor (int i = 0; i < N; i++) {if (flag == 1) {// 先判断结束标志return;}//判断数组第一个元素放进来是否不符合题目条件,不符合就先往B放数组后面的数据,满足条件后再往A放第一个元素。if (a == 0 && Math.abs(arr[0] - sum(B)) > R) {break;}if (vis[i] == 0) {A[a++] = arr[i];vis[i] = 1;DFS(arr, step + 1);A[--a] = 0;vis[i] = 0;}}// 放完A后,往B放元素for (int i = 1; i < N; i++) {//题目要求给的数组第一个必须给A,所以从第二个开始才能给Bif (flag == 1) {// 先判断结束标志return;}if (vis[i] == 0) {B[b++] = arr[i];vis[i] = 1;DFS(arr, step + 1);B[--b] = 0;vis[i] = 0;}}}}

提交结果

之前提交的代码拿了80分,分析评测数据,
输入数据

4 50
76 25 100 1

输出数据

76
1 25 100

程序运行结果

1 25 100
76

分析结果:以为答案给错了,感谢评论区的朋友告诉了细节,只需要保证数组的第一个元素放到A,并不是要从A开始放。所以最后一个答案解释是:先往B放1、25后,往A放入数组第一个元素76,然后再往B放100。

修改了代码判断条件后,已AC。

蓝桥杯 试题 算法训练 娜神平衡 java实现相关推荐

  1. 蓝桥杯 试题 算法训练 娜神平衡Java

    资源限制 时间限制:1.0s   内存限制:256.0MB 问题描述 娜娜是一个特别可爱的女孩子,作为学神的她最近在情感方面出现了一点点小问题. 她暗恋的琦琦是一名学霸,他只喜欢长得漂亮和学习很好的女 ...

  2. 蓝桥杯 试题 算法训练 娜神平衡 C++ 详解

    问题描述: 娜娜是一个特别可爱的女孩子,作为学神的她最近在情感方面出现了一点点小问题. 她暗恋的琦琦是一名学霸,他只喜欢长得漂亮和学习很好的女生. 娜娜学习确实很神,但是她在琦琦面前却总是表现不出平时 ...

  3. 试题 算法训练 娜神平衡

    问题描述 娜娜是一个特别可爱的女孩子,作为学神的她最近在情感方面出现了一点点小问题. 她暗恋的琦琦是一名学霸,他只喜欢长得漂亮和学习很好的女生. 娜娜学习确实很神,但是她在琦琦面前却总是表现不出平时的 ...

  4. 蓝桥杯 试题 算法训练 无聊的逗 C++ 详解

    题目: 逗志芃在干了很多事情后终于闲下来了,然后就陷入了深深的无聊中.不过他想到了一个游戏来使他更无聊.他拿出n个木棍,然后选出其中一些粘成一根长的,然后再选一些粘成另一个长的,他想知道在两根一样长的 ...

  5. 蓝桥杯 试题 算法训练 无聊的逗 C++ 详解 - 未完善

    题目: 逗志芃在干了很多事情后终于闲下来了,然后就陷入了深深的无聊中.不过他想到了一个游戏来使他更无聊.他拿出n个木棍,然后选出其中一些粘成一根长的,然后再选一些粘成另一个长的,他想知道在两根一样长的 ...

  6. 蓝桥杯 试题 算法训练 筛选号码 Java

    蓝桥杯 试题 算法训练 筛选号码Java 算法训练 筛选号码 资源限制 时间限制:1.0s 内存限制:512.0MB 问题描述 有n个人围成一圈,顺序排号(编号为1到n).从第1个人开始报数(从1到3 ...

  7. 蓝桥杯 试题 算法训练 无聊的逗

    蓝桥杯 试题 算法训练 无聊的逗 问题描述 逗志芃在干了很多事情后终于闲下来了,然后就陷入了深深的无聊中.不过他想到了一个游戏来使他更无聊.他拿出n个木棍,然后选出其中一些粘成一根长的,然后再选一些粘 ...

  8. 蓝桥杯试题 算法训练 绘制地图

    蓝桥杯试题 算法训练 绘制地图 问题描述 最近,WYF正准备参观他的点卡工厂.WYF集团的经理氰垃圾需要帮助WYF设计参"观"路线.现在,氰垃圾知道一下几件事情: 1.WYF的点卡 ...

  9. 蓝桥杯 试题 算法训练 24点 C++ 详解

    问题描述: 24点游戏是一个非常有意思的游戏,很流行,玩法很简单:给你4张牌,每张牌上有数字(其中A代表1,J代表11,Q代表12,K代表13),你可以利用数学中的加.减.乘.除以及括号想办法得到24 ...

最新文章

  1. ceph存储引擎bluestore解析
  2. 【实战】OpenCV钢管计数分析与方法比较
  3. 淘宝特价版给拼多多送芒果,网友:这是什么操作?
  4. 使用idea对生产环境的JAVA应用进行远程调试
  5. leetcode 497, 528. Random Point in Non-overlapping Rectangles | 497. 非重叠矩形中的随机点(Java)
  6. Java当中迭代器的使用(遍历容器ArrayList, HashSet,HashMap)
  7. 刷recovery工具apk_红米note4X刷lineage,不喜欢miui10广告臃肿的可以试一试
  8. 【Android】Android6.0发送短信Demo
  9. 入门mysql执行计划
  10. 造兵三国的服务器要维护多久,FAQ_造兵三国_九游手机游戏
  11. 谈谈Linux下动态库查找路径的问题
  12. 定义泛型集合的命名空间:System.Collections.Generic
  13. IIS5.1、IIS6.0、IIS7.5中安装配置MVC 3
  14. Windows server 2003 下载
  15. Telerik UI for Xamarin使用教程 - AndroidX使用指南
  16. uniapp重新渲染页面_uni-app里面使用uni.request请求并且渲染列表
  17. 桌面上的计算机图标是一个,电脑桌面上计算机图标不见如何找回
  18. spring boot 2.0 配置logback日志
  19. 12:Linux日常运维技巧-1
  20. c++和java学哪个好,c++和java区别 学哪个比较好

热门文章

  1. 【记录】关于Intel wireless-ac-9461错误代码56或10
  2. [现代控制理论]3_Phase_portrait 相图 相轨迹
  3. 手机为何连不上WIFI,到底是谁的问题?
  4. java so reuseport_强大的SO_REUSEPORT
  5. 方正圆明服务器装系统的引导盘,续安装。 安装信息
  6. ubuntu20.04安装RTL8821CU wifi driver
  7. 微信公众号分享、支付开发
  8. CF1558D Top-Notch Insertions
  9. Java 8 Optional 详细用法
  10. 一篇文章说清楚视频查重的底层逻辑和去重的方法