资源限制
时间限制:1.0s 内存限制:256.0MB
问题描述
  最近的m天盾神都去幼儿园陪小朋友们玩去了~
  每个小朋友都拿到了一些积木,他们各自需要不同数量的积木来拼一些他们想要的东西。但是有的小朋友拿得多,有的小朋友拿得少,有些小朋友需要拿到其他小朋友的积木才能完成他的大作。如果某个小朋友完成了他的作品,那么他就会把自己的作品推倒,而无私地把他的所有积木都奉献出来;但是,如果他还没有完成自己的作品,他是不会把积木让出去的哟~
  盾神看到这么和谐的小朋友们感到非常开心,于是想帮助他们所有人都完成他们各自的作品。盾神现在在想,这个理想有没有可能实现呢?于是把这个问题交给了他最信赖的你。
输入格式
  第一行为一个数m。
  接下来有m组数据。每一组的第一行为n,表示这天有n个小朋友。接下来的n行每行两个数,分别表示他现在拥有的积木数和他一共需要的积木数。
输出格式
  输出m行,如果第i天能顺利完成所有作品,输出YES,否则输出NO。
样例输入
2
2
2 2
1 3
3
1 5
3 3
0 4
样例输出
YES
NO
数据规模和约定
  1<=n<=10000,1<=m<=10。

思路 :优先满足还需(need-have)最少的,如果不能满足证明无法完成,反之继续则将其拥有的 (此时have=>need)收入一个计数器中(表示共可支配的积木),依次..满足所有,则成功

问题:需要一个排序(升序),使用冒泡 Time=(2*N^2)M=O(2e9)超时,但是该算法的核心需求就是有序,那么只有可能从排序上优化
注:当然由于MAX(N
N)=1e5 使用常规的Scanner也会超时,必须改用StreamReader

原版本

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;class Main{public static void main(String[] args) throws IOException {BufferedReader in=new BufferedReader(new InputStreamReader(System.in));int m=Integer.parseInt(in.readLine());while(0<m--) {int n=Integer.parseInt(in.readLine());int arr[][]=new int[n][2];int useable=0;for (int i = 0; i < n; i++) {String[] row=in.readLine().split(" ");arr[i][0]=Integer.parseInt(row[0]);arr[i][1]=Integer.parseInt(row[1]);    if (arr[i][0]>=arr[i][1]) {useable+=arr[i][0]; //将他拥有的累计arr[i][1]=0; //他不再需要了}}for (int i = 0; i < n-1; i++) {   //升序for (int j = i+1; j < arr.length; j++) {if (arr[i][1]>arr[j][1]) {{int temp=arr[i][0];arr[i][0]=arr[j][0];arr[j][0]=temp;}{int temp=arr[i][1];arr[i][1]=arr[j][1];arr[j][1]=temp;}}}}int flag=0;for (int i = 0; i < n; i++,flag++) {if(arr[i][1]==0) continue;  //跳过完成的useable-=(arr[i][1]-arr[i][0]);if (useable<0) break;useable+=arr[i][1];}if (flag==n) System.out.println("YES");else System.out.println("NO");}}
}

改进之后

参考的是 https://www.hdvsyu.com/posts/363/

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;public class 盾神与积木游戏 {  //已优化public static void main(String[] args) throws IOException {BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));int m = Integer.parseInt(bufferedReader.readLine());for (int i = 0; i < m; i++) {int n = Integer.parseInt(bufferedReader.readLine());Child[] childs = new Child[n];for (int j = 0; j < n; j++) {String[] t = bufferedReader.readLine().split(" ");childs[j] = new Child(Integer.parseInt(t[0]), Integer.parseInt(t[1]));}System.out.println(bankAlgorithm(childs));}bufferedReader.close();}private static String bankAlgorithm(Child[] childs) {Arrays.sort(childs);int currentNeed = 0;for (int i = 0; i < childs.length; i++) {if (childs[i].need <= 0) {currentNeed += childs[i].have;} else { // childs[i].need > 0if (currentNeed >= childs[i].need) {currentNeed += childs[i].have;} else {return "NO";}}}return "YES";}
}class Child implements Comparable<Child> {int have;int total;int need;public Child(int have, int total) {this.have = have;this.total = total;this.need = total - have;}public int compareTo(Child child) {return this.need - child.need;   //降序
//      return child.need - this.need;   //升序}}

总结:其实一开始是想用类,但考虑到数组性能优于类,可在排序部分如果想优化成更高效率的select-sorted 或 merge-sorted等是很不易的,原因要将二维数组扁平化处理。而Java本身提供的Arrays.sort内部实现已经是一个比较令人满意的效率了,问题就是得重写Comparable接口compareTo方法,也算扩充了一下知识吧

试题 算法提高 盾神与积木游戏相关推荐

  1. 算法提高 盾神与积木游戏

    算法提高 盾神与积木游戏   时间限制:1.0s   内存限制:256.0MB 问题描述 最近的m天盾神都去幼儿园陪小朋友们玩去了~ 每个小朋友都拿到了一些积木,他们各自需要不同数量的积木来拼一些他们 ...

  2. 蓝桥杯 ADV-194 算法提高 盾神与积木游戏 java版

    问题描述 最近的m天盾神都去幼儿园陪小朋友们玩去了~ 每个小朋友都拿到了一些积木,他们各自需要不同数量的积木来拼一些他们想要的东西.但是有的小朋友拿得多,有的小朋友拿得少,有些小朋友需要拿到其他小朋友 ...

  3. [Java] 蓝桥杯ADV-194 算法提高 盾神与积木游戏

    问题描述 最近的m天盾神都去幼儿园陪小朋友们玩去了~ 每个小朋友都拿到了一些积木,他们各自需要不同数量的积木来拼一些他们想要的东西.但是有的小朋友拿得多,有的小朋友拿得少,有些小朋友需要拿到其他小朋友 ...

  4. 蓝桥杯 ADV-194算法提高 盾神与积木游戏(贪心)

    问题描述 最近的m天盾神都去幼儿园陪小朋友们玩去了~ 每个小朋友都拿到了一些积木,他们各自需要不同数量的积木来拼一些他们想要的东西.但是有的小朋友拿得多,有的小朋友拿得少,有些小朋友需要拿到其他小朋友 ...

  5. 试题 算法训练 盾神与离散老师2

    试题 算法训练 盾神与离散老师2 资源限制 **时间限制:**1.0s 内存限制:256.0MB 问题描述 有一天,盾神觉得自己离散课快要挂了,于是亲自找到离散老师WH,请教如何才能不挂科.WH老师说 ...

  6. [蓝桥杯][算法提高VIP]盾神与积木游戏(贪心)

    题目描述 最近的m天盾神都去幼儿园陪小朋友们玩去了~ 每个小朋友都拿到了一些积木,他们各自需要不同数量的积木来拼一些他们想要的东西.但是有的小朋友拿得多,有的小朋友拿得少,有些小朋友需要拿到其他 小朋 ...

  7. 蓝桥杯试题盾神与积木游戏之论减少时间复杂度的重要性

    问题描述 最近的m天盾神都去幼儿园陪小朋友们玩去了~ 每个小朋友都拿到了一些积木,他们各自需要不同数量的积木来拼一些他们想要的东西.但是有的小朋友拿得多,有的小朋友拿得少,有些小朋友需要拿到其他小朋友 ...

  8. OJ题--盾神与积木游戏

    问题描述 : 最近的m天盾神都去幼儿园陪小朋友们玩去了~ 每个小朋友都拿到了一些积木,他们各自需要不同数量的积木来拼一些他们想要的东西.但是有的小朋友拿得多,有的小朋友拿得少,有些小朋友需要拿到其他小 ...

  9. 算法笔记_098:蓝桥杯练习 算法提高 盾神与条状项链(Java)

    目录 1 问题描述 2 解决方案   1 问题描述 问题描述 有一天,盾神捡到了好多好多五颜六色的珠子!他心想这些珠子这么漂亮,可以做成一条项链然后送给他心仪的女生~于是他用其中一些珠子做成了长度为n ...

  10. [Java] 蓝桥杯ADV-193 算法提高 盾神与条状项链

    问题描述 有一天,盾神捡到了好多好多五颜六色的珠子!他心想这些珠子这么漂亮,可以做成一条项链然后送给他心仪的女生~于是他用其中一些珠子做成了长度为n的项链.当他准备把项链首尾相接的时候,土方进来了. ...

最新文章

  1. UESTC-1057 秋实大哥与花(线段树+成段加减+区间求和)
  2. 查询v$lock缓慢和direct path write temp等待
  3. 用HTML和CSS实现一个漂亮的个人博客页面!
  4. 了解OPhone平台---OPhone平台架构和主要开发组件
  5. 支付宝回调接口验签失败
  6. 目标检测之Selective Search原理简述(转)
  7. Linux Server - NIS
  8. 获取Nist的美国官方标准时间的解决办法
  9. 【学习笔记】程序设计导引及在线实践 数值转换问题(2)
  10. 如何将手机号码批量导入手机通讯录
  11. jit流线制_JIT精益生产实务四—安定化生产.ppt
  12. mysql,php,redis,jq小记
  13. Win11系统频繁断网怎么办?Win11网络不稳定的解决方法
  14. 如何标题编号自动生成_标题编号的自动生成+自动修改的方法步骤
  15. Android Studio 调试的时候出现 Access denied finding property “ro.serialno“
  16. linux 内核链表
  17. C++编程笔记:使用WinHTTP实现HTTP访问(解决接收UTF8数据乱码问题)
  18. std在汇编语言是什么指令_汇编语言指令
  19. python 电脑文件变动提醒_Python实现定时弹窗提醒
  20. .NET 程序员必备工具下载(2)(完结)

热门文章

  1. 奇迹暖暖服务器不稳定,奇迹暖暖怎么换服务器
  2. 国内互联网大数据的发展现状和应用
  3. 录制脚本前要在浏览器中设置代理服务器的原因
  4. hdu4747-线段树
  5. ASP.NET MVC中商品模块小样
  6. 高德地图完整功能的html,关于高德地图WEB版基础控件的展示
  7. DCN可形变卷积实现1:Python实现
  8. java助教面试自我介绍,面试英语助教自我介绍
  9. October CMS
  10. 游戏本地化翻译有哪些内容需要注意