【贪心】【高精度】zoj3987 Numbers
生活随笔
收集整理的這篇文章主要介紹了
【贪心】【高精度】zoj3987 Numbers
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
題意:給你一個數(shù)n,讓你找m個非負整數(shù),使得它們的和為n,并且按位或起來以后的值最小化。輸出這個值。
從高位到低位枚舉最終結(jié)果,假設(shè)當(dāng)前是第i位,如果m*(2^i-1)<n的話,那么說明這一位如果填零,剩下的位不論怎么填,都絕對湊不出n來,所以這一位必須填1.如果m*(2^i-1)>=n,這一位就填1,然后把n變?yōu)閙ax(n mod 2^i , n-m*2^i),重復(fù)這個過程即可。
要用高精度。
import java.util.*; import java.io.*; import java.math.*;public class Main{public static void main(String[] argc){int T;BigInteger n,m;BigInteger[] pw=new BigInteger[4005];pw[0]=BigInteger.ONE;for(int i=1;i<=4001;++i){pw[i]=pw[i-1].multiply(BigInteger.valueOf(2l));}Scanner sc = new Scanner (new BufferedInputStream(System.in));T=sc.nextInt();for(int zu=1;zu<=T;++zu){n=sc.nextBigInteger();m=sc.nextBigInteger();String s=n.toString();int len=s.length();BigInteger ans=BigInteger.ZERO;for(int i=len*4;i>=0;--i){BigInteger tmp=m.multiply(pw[i].subtract(BigInteger.ONE));if(tmp.compareTo(n)==-1){ans=ans.add(pw[i]);BigInteger t=n.subtract(m.multiply(pw[i]));BigInteger t2=n.mod(pw[i]);if(t.compareTo(t2)==1){n=t;}else{n=t2;}}}System.out.println(ans);}sc.close();} }轉(zhuǎn)載于:https://www.cnblogs.com/autsky-jadek/p/7773754.html
總結(jié)
以上是生活随笔為你收集整理的【贪心】【高精度】zoj3987 Numbers的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: MapReduce寻找共同好友
- 下一篇: [转载]带你玩转Visual Studi