码迷,mamicode.com
首页 > 编程语言 > 详细

JAVA大数贪心

时间:2018-05-17 18:50:03      阅读:153      评论:0      收藏:0      [点我收藏+]

标签:必须   分析   大数   mat   []   math   VID   最小   代码   

 

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

思路分析:

一个简单的贪心,从高位到低位,判断当前位可否为 1 ,若可以,则将所有的数的这一位全部都变成 1

代码示例:

import java.math.*;
import java.util.*;

public class study {

	public static void main(String[] args) {	
		Scanner cin = new Scanner(System.in);
		BigInteger n, m;
		
		
		int t = cin.nextInt();
		for(int cas = 0; cas < t; cas++) {
			n = cin.nextBigInteger();
			m = cin.nextBigInteger();
			BigInteger ans = BigInteger.valueOf(0);
			
			int len = 0;
                        BigInteger ss = n, v = BigInteger.valueOf(0);
                        while(ss.compareTo(v)>0){
                            ss = ss.divide(BigInteger.valueOf(2));
                            len++;
                        }    
			
			for(int i = len; i >= 0; i--) {
				BigInteger tem = BigInteger.valueOf(2);
				tem = tem.pow(i).subtract(BigInteger.valueOf(1)).multiply(m);
				//System.out.println(tem);
				if (tem.compareTo(n) < 0) {
					BigInteger f = BigInteger.valueOf(2).pow(i);
					ans = ans.add(f);
					BigInteger p = n.divide(f);
					if (p.compareTo(m) >= 0) n = n.subtract(m.multiply(f));
					else n = n.subtract(p.multiply(f));
					//System.out.println(f);
					//System.out.println(p);
				}
			}
			System.out.println(ans);
		}
	}

}
           

 

JAVA大数贪心

标签:必须   分析   大数   mat   []   math   VID   最小   代码   

原文地址:https://www.cnblogs.com/ccut-ry/p/9052595.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!