HDU - 5920 Ugly Problem(Java大数+贪心)
生活随笔
收集整理的這篇文章主要介紹了
HDU - 5920 Ugly Problem(Java大数+贪心)
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
題目鏈接:點擊查看
題目大意:給出一個非常大的數(shù)字 n (),現(xiàn)在要求將其拆分為數(shù)量不超過?50 個的回文串之和
題目分析:貪心去分就好了,貪心策略如下,奇偶兩種情況:對于奇串 12345:
對于偶串 123456:
這樣就好了,因為每次選擇了前半段,所以每次數(shù)字的長度都會減少一半,那么??所需要的操作次數(shù)也是 log(1000) 次就夠了
選出的前半段需要減一,是為了保證構(gòu)造出來的回文串一定比原數(shù)字要小,如果數(shù)字是 321 的話,選出前半段 32 直接構(gòu)造成 323 的話,會比原數(shù)字還要大,但如果減一構(gòu)造出 313 的話,就能保證一定比原數(shù)字要小了
最后當(dāng)數(shù)字小于 20 的時候需要特判一下,不然會陷入死循環(huán)
剩下的用 java 模擬就好了,因為需要大數(shù)和字符串之間頻繁的轉(zhuǎn)換,用 C++ 的話會比較繁瑣
代碼:
import java.math.BigInteger; import java.util.Scanner;class Main {static Scanner cin = new Scanner(System.in);public static void main(String []args) {int kase=cin.nextInt();BigInteger _20=BigInteger.valueOf(20);for(int t=1;t<=kase;t++){String ans[]=new String[60];int cnt=0;BigInteger n=cin.nextBigInteger();while(n.compareTo(_20)>=1)//n>=20{String res;String s=n.toString();int len=s.length();String s1=s.substring(0,(len+1)/2);BigInteger temp=new BigInteger(s1);temp=temp.subtract(BigInteger.ONE);//減一s1=temp.toString();if((len&1)==0)//偶數(shù)串{StringBuffer s2=new StringBuffer(s1);s2.reverse();res=s1+s2.toString();}else//奇數(shù)串{StringBuffer s2=new StringBuffer(s1.substring(0,len/2));s2.reverse();res=s1+s2.toString();}ans[++cnt]=res;BigInteger num=new BigInteger(res);n=n.subtract(num);}int num=n.intValue();if(num>=11)//[11,20]{num-=11;ans[++cnt]=String.valueOf(11);}if(num==10)//特判10{num-=9;ans[++cnt]=String.valueOf(9);}if(num!=0){ans[++cnt]=String.valueOf(num);}System.out.printf("Case #%d:\n%d\n",t,cnt);for(int i=1;i<=cnt;i++)System.out.println(ans[i]);}} }?
總結(jié)
以上是生活随笔為你收集整理的HDU - 5920 Ugly Problem(Java大数+贪心)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: HDU - 5919 Sequence
- 下一篇: 中石油训练赛 - Fermat‘s Op