http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3987

题意:
给出一个数n,现在要将它分为m个数,这m个数相加起来必须等于n,并且要使得这m个数的或值最小。

思路:

从二进制的角度分析,如果这m个数中有一个数某一位为1,那么最后或起来这一位肯定是为1的,所以如果某一位为1了,那么我们尽量就让其余位也等于1。

所以我们从最高位开始枚举,看看这一位是否需要为1,如果需要为1的话,那么剩下的几个数也尽量让这一位等于1。

 1 import java.math.*;
 2 import java.util.Scanner;
 3
 4 public class Main {
 5     public static void main(String[] args) {
 6         BigInteger n, m;
 7         Scanner in = new Scanner(System.in);
 8         int T = in.nextInt();
 9         for(int cas=0;cas<T;cas++){
10             n = in.nextBigInteger();
11             m = in.nextBigInteger();
12             int len = 0;
13             BigInteger ss = n;
14             while(ss.compareTo(BigInteger.ZERO)>0){
15                 ss = ss.divide(BigInteger.valueOf(2));
16                 len++;
17             }
18             BigInteger tmp;
19             BigInteger ans = new BigInteger("0");
20             for(int i = len; i>0; i--){
21                 if(n.compareTo(BigInteger.ZERO)<=0)  break;
22                 tmp = BigInteger.valueOf(2).pow(i-1).subtract(BigInteger.valueOf(1));
23                 BigInteger sum = tmp.multiply(m);
24                 if(sum.compareTo(n)<0){
25                     BigInteger num = n.divide(BigInteger.valueOf(2).pow(i-1));
26                     if(num.compareTo(m)>0)  num = m;
27                     n = n.subtract(BigInteger.valueOf(2).pow(i-1).multiply(num));
28                     ans = ans.add(BigInteger.valueOf(2).pow(i-1));
29                 }
30             }
31             System.out.println(ans);
32         }
33         in.close();
34     }
35 }

转载于:https://www.cnblogs.com/zyb993963526/p/7765437.html

ZOJ 3987 Numbers(Java枚举)相关推荐

  1. ZOJ 3987 Numbers 2017CCPC秦皇岛站G题 大整数 二进制 贪心

    题目:https://cn.vjudge.net/problem/ZOJ-3987 题意:给出一个数n(不超过4000个十进制数字),将其分成m(不超过10的100次方)个数,要求这m个数的和等于n. ...

  2. java 枚举的继承_java中枚举类可以被继承吗?

    java 枚举类 java中,使用关键字enum来定义枚举类,枚举类是一个特殊的类,大部分功能和普通类是一样的,区别为: ● 枚举类继承了java.lang.Enum类,而不是默认的Object类.而 ...

  3. Java枚举类使用方式

    Java枚举类使用方式 单枚举定义 : /*** * @title: 单枚举定义* @author: wll* @since: 2021-1-27 14:47:54*/ public enum Jud ...

  4. 比起睡觉,我更喜欢刷巨详细的Java枚举类,这是来自猿人的自觉呀

    零基础学习之Java枚举类 概述 JDK1.5之前 创建枚举类 代码示例 JDK1.5之后 创建枚举类 代码示例 枚举类继承父类 基本介绍 代码示例 枚举类实现接口 基本介绍 代码示例 枚举类实现单例 ...

  5. 你一定需要知道的高阶JAVA枚举特性!

    JAVA枚举,比你想象中功能还要强大! 我经常发现自己在Java中使用枚举来表示某个对象的一组值. 在编译时确定类型可以具有什么值的能力是一种强大的能力,它为代码提供了结构和意义. 当我第一次了解枚举 ...

  6. Java枚举原来还能这么用

    点击蓝色"程序猿DD"关注我 回复"资源"获取独家整理的学习资料! 前言 相信不少java开发者写过状态变更的业务,比如订单流程.请假流程等等.一般会搞一个状态 ...

  7. java 注解 enum_13 Java枚举和注解

    Java枚举 在某些情况下,一个类的对象是有限而且固定的.例如季节类,只能有 4 个对象. 当类的对象是有限时,就应该使用枚举,而不使用普通类.(枚举对象是单例模式) 枚举的属性 实现接口的枚举类 例 ...

  8. java 枚举(enum) 详细用法

    用法一:常量 在JDK1.5 之前,我们定义常量都是: public static fianl.... .现在好了,有了枚举,可以把相关的常量分组到一个枚举类型里,而且枚举提供了比常量更多的方法. p ...

  9. Java 枚举:实现接口

    http://blog.csdn.net/veryitman/article/details/7945949 所有的枚举类都继承自 Enum,因为 Java 不支持多继承,所以枚举无法继承其它类. 但 ...

  10. java枚举使用详解

    http://www.cnblogs.com/linjiqin/archive/2011/02/11/1951632.html java枚举使用详解 在实际编程中,往往存在着这样的"数据集& ...

最新文章

  1. EF映射之修改数据库
  2. show status用法
  3. python数据的格式输出_python
  4. 列表是不是python数据类型的是_在Python中,一个列表中的数据类型是否可以不相同?(回答可以or不可以)...
  5. 【SpringBoot】整合jdbc
  6. 前端代码 review 流程规范
  7. sam卡和sim卡区别_SAM卡概述
  8. python微博评论情感分析_用python对鹿晗、关晓彤微博进行情感分析
  9. python-字符串 修改间隔符 and定义变量 交换变量
  10. 25.Linux系统忘记登录密码解决办法(别着急,还能抢救一下)
  11. 致命错误:异常代码=C0000005(这篇最详细,收藏之~)
  12. 人不可貌象、小三不可斗量
  13. 硬盘卡住磁头的解决办法
  14. 51之hex程序烧到单片机
  15. 计算机无法唤醒,电脑休眠后无法唤醒怎么办 电脑休眠后无法唤醒原因及解决方法...
  16. 中台战略下的保险订单销售模式设计
  17. 【CSDN超实用的浏览器插件】——去广告、快捷搜索、自定义工具等诸多功能等你探索
  18. C++ int类型最大最小数字(16进制)
  19. java list高效去重_简述Java List去重五种方法
  20. 超实用的网页页脚设计小技巧

热门文章

  1. 还有没换国旗头像的么 头像领取方法 不要再@微信官方啦
  2. 提高github下载速度的方法
  3. 编译Android版本的chromium浏览器
  4. 离线强化学习-4 DP-based方法
  5. 「缠师课后回复精选」第14课: 喝茅台的高潮程序!
  6. 企业部署信息安全等级保护的重要性
  7. csgo服务器搭建 linux,Centos 搭建 CSGO KZ 服务器
  8. 暴雪-关于坚持的故事(转)
  9. Monte Carlo(MC) Policy Evaluation 蒙特·卡罗尔策略评估
  10. HASH 、MD、SHA、MAC、HMAC、SM3