博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
分遗产
阅读量:5935 次
发布时间:2019-06-19

本文共 3517 字,大约阅读时间需要 11 分钟。

hot3.png

题目描述

  有一位阿拉伯老人,生前养有11匹马,他去世前立下遗嘱:大儿子、二儿子、小儿子分别继承遗产的1/2、1/4、1/6。

  儿子们想来想去没法分:他们所得到的都不是整数,即分别为11/2、11/4、11/6,总不能把一匹马割成几块来分吧?
  聪明的邻居牵来了自己的一匹马,对他们说:“你们看,现在有12匹马了,老大得12匹的1/2就是6匹,老二得12匹的1/4就是3匹, 老三得12匹的1/6就是2匹,还剩一匹我照旧牵回家去。”这样把难分的问题解决了。
  现在又有一个老人要分遗产了,他有m匹马(1≤m≤1000000),并且有n个儿子(1≤n≤10),每个儿子分别得到1/a1、1/a2、…、1/an的遗产。
  因为马不能分割,并且遗产要全部分完,所以请你用上面那位聪明的邻居的方法计算一下每个儿子能分到几匹马

1.1 输入描述:

  输入包括多组数据。

  每组测试数据包括两行:
  第一行为m、n,分别代表老人拥有的马匹数和几个儿子。
  第二行有n个数据a1、a2、…、an,依次代表大儿子、二儿子…第n个儿子分到的遗产的份额。(0 < ai < 50)
  程序以输入0 0结束,该行不做处理。

1.2 输出描述:

  按照上面介绍的方法解决这个问题。

  如果那种方法不能解决这个问题(即所有儿子不能得到整数匹马),则你的程序要输出”Can’t Solve”;
  否者依次输出大儿子、二儿子…得到的马的匹数。
  每个数之间有一个空格隔开(最后一个数据后面没有空格)。

1.3 输入例子:

11 32 4 62 23 30 0

 

1.4 输出例子:

6 3 21 1

 

2 解题思路

  假设输入的划分数组为arr,总的马匹数为hours,对arr进行如下操作可以求解.

1) 先求出arr的最小公倍数v

2) 求最小公倍数的倍数times,使得times * v / arr[i]的和(记为sum)不小于hours
3) 如果找到sum=hours,说明找到分配方案,否则没有找到分配方案

3 算法实现

import java.util.Scanner;/** * Declaration: All Rights Reserved !!! */public class Main {    public static void main(String[] args) {        Scanner scanner = new Scanner(System.in);//        Scanner scanner = new Scanner(Main.class.getClassLoader().getResourceAsStream("data.txt"));        while (scanner.hasNextLine()) {            String line = scanner.nextLine();            if (line.contains("0 0")) {                break;            }            String[] parts = line.split("(\\s)+");            // 马匹数            long hours = Long.parseLong(parts[0]);            // 儿子数            int num = Integer.parseInt(parts[1]);            line = scanner.nextLine();            parts = line.split("(\\s)+");            int[] arr = new int[parts.length];            for (int i = 0; i < arr.length; i++) {                arr[i] = Integer.parseInt(parts[i]);            }            System.out.println(heritage(hours, arr));        }        scanner.close();    }    /**     * 分遗产     * 

* 思路: * 一、先求出arr的最小公倍数v * 二、求最小公倍数的倍数times,使得times * v / arr[i]的和(记为sum)不小于hours * 三、如果找到sum=hours,说明找到分配方案,否则没有找到分配方案 * * @param hours 遗产中的马匹数 * @param arr 每个儿子所得马匹的几分之几 * @return 遗产划分结果 */ private static String heritage(long hours, int[] arr) { // 其实hours可以不使用 long v = arr[0]; // 求数组中所有元素的最小公倍数 for (int i = 1; i < arr.length; i++) { v = lcm(v, arr[i]); } // 求最小公倍数的倍数times,使得times * v / arr[i]的和(记为sum)不小于hours long sum; long[] result = new long[arr.length]; for (int times = 1; ; times++) { sum = 0; for (int i = 0; i < arr.length; i++) { result[i] = times * v / arr[i]; sum += result[i]; } if (sum >= hours) { break; } } // 如果找到sum=hours,说明找到分配方案,否则没有找到分配方案 if (sum != hours) { return "Can't Solve"; } else { StringBuilder b = new StringBuilder(); for (long i : result) { b.append(i).append(' '); } return b.substring(0, b.length() - 1); } } /** * 求最小公倍数 * * @param a 正整数 * @param b 正整数 * @return 最小倍约数 */ private static long lcm(long a, long b) { return a * b / gcd(a, b); } /** * 求最大公约数 * * @param a 正整数 * @param b 正整数 * @return 最大公约数 */ private static long gcd(long a, long b) { long t; // 辗转相除 while ((t = a % b) != 0) { a = b; b = t; } return b; }}

 

4 测试结果

 

这里写图片描述

 

转载于:https://my.oschina.net/u/2822116/blog/829029

你可能感兴趣的文章
鸟哥的linux私房菜-shell简单学习-1
查看>>
nagios配置监控的一些思路和工作流程
查看>>
通讯组基本管理任务三
查看>>
赫夫曼编码实现
查看>>
html页面显示div源代码
查看>>
基础复习-算法设计基础 | 复杂度计算
查看>>
debian、ubuntu系统下,常用的下载工具
查看>>
带以太网的MicroPython开发板:TPYBoardv201温湿度上传实例
查看>>
如何解压缩后缀名为zip.001,zip.002等的文件
查看>>
OSGI企业应用开发(十二)OSGI Web应用开发(一)
查看>>
Python 以指定概率获取元素
查看>>
微信公众平台图文教程(二) 群发功能和素材管理
查看>>
关于System.Collections空间
查看>>
MPP(大规模并行处理)
查看>>
Centos下基于Hadoop安装Spark(分布式)
查看>>
POJ2348 UVa10368 HDU1525 Euclid's Game【博弈】
查看>>
Java 位运算
查看>>
好用的CSS模块化打包工具CSS-COMBO
查看>>
python 中的字符和字符串
查看>>
C#Winform限制Textbox只能输入数字
查看>>