日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > java >内容正文

java

HDU - 5920 Ugly Problem(Java大数+贪心)

發(fā)布時間:2024/4/11 java 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 HDU - 5920 Ugly Problem(Java大数+贪心) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

題目鏈接:點擊查看

題目大意:給出一個非常大的數(shù)字 n (),現(xiàn)在要求將其拆分為數(shù)量不超過?50 個的回文串之和

題目分析:貪心去分就好了,貪心策略如下,奇偶兩種情況:對于奇串 12345:

  • 選擇前半段 123
  • 將其減一,變?yōu)?122
  • 構(gòu)造回文串 12221
  • 用原數(shù)字減去當(dāng)前回文串然后繼續(xù)操作
  • 對于偶串 123456:

  • 選擇前半段 123
  • 將其減一,變?yōu)?122
  • 構(gòu)造回文串 122221
  • 用原數(shù)字減去當(dāng)前回文串然后繼續(xù)操作
  • 這樣就好了,因為每次選擇了前半段,所以每次數(shù)字的長度都會減少一半,那么??所需要的操作次數(shù)也是 log(1000) 次就夠了

    選出的前半段需要減一,是為了保證構(gòu)造出來的回文串一定比原數(shù)字要小,如果數(shù)字是 321 的話,選出前半段 32 直接構(gòu)造成 323 的話,會比原數(shù)字還要大,但如果減一構(gòu)造出 313 的話,就能保證一定比原數(shù)字要小了

    最后當(dāng)數(shù)字小于 20 的時候需要特判一下,不然會陷入死循環(huán)

  • 0 無需處理
  • 1 ~ 9 保持原數(shù)字
  • 10 拆為 1 和 9
  • 11 ~ 20 拆為 11 + x ,x < 10
  • 剩下的用 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)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。