[7/30] 買香蕉

MIOJ #98 買香蕉 ??

描述

我是一個(gè)愛(ài)吃香蕉的強(qiáng)迫癥蜀铲。今天我要去水果店論筐買香蕉戈稿。 現(xiàn)在水果店有好多筐香蕉守谓,我的要求是買回來(lái)的每一筐里必須有相同數(shù)量的香蕉紧卒。 為了實(shí)現(xiàn)這個(gè)目標(biāo)昆烁,你可以每次做兩件事情侥加。 1)放棄筐里的一部分香蕉 2)連筐帶香蕉放棄一整筐 我想知道我能得到最多多少香蕉缆娃。

輸入

以空格分割的多個(gè)正整數(shù)媒抠,每個(gè)正整數(shù)表示一筐香蕉的總香蕉數(shù)

輸出

最多能得到的香蕉數(shù)

輸入樣例

1 2 3
5 0 29 14

輸出樣例

4
29

解法

大力出奇跡弟断,暴力解法

這個(gè)問(wèn)題無(wú)非是選擇哪幾筐的問(wèn)題,先把所有可能的選擇枚舉出來(lái)趴生,然后找到每個(gè)選擇中最小的那筐阀趴,每筐都是這個(gè)數(shù)量時(shí)就是最終獲得的香蕉數(shù)量,遍歷所有所有選擇然后找到香蕉數(shù)量最大的即可苍匆。

第一步:枚舉出所有的方案刘急。集合 {1,2,3}枚舉出所有的方案有
23 種,除去空集浸踩,還有7個(gè)叔汁。1~7,幾個(gè)數(shù)字換算為二進(jìn)制分別是,001检碗,010据块,011,100折剃,101另假,110,111怕犁,每一位的0還是1可以視作是否選擇這個(gè)元素边篮。依照這個(gè)想法,我們可以寫(xiě)出程序枚舉出所有的可能方案奏甫。

第二步:計(jì)算每一種方案對(duì)應(yīng)可獲得的香蕉數(shù)量戈轿,就是每種方案中香蕉數(shù)量最小值*筐的數(shù)量。

代碼如下:


package  com.li2niu.mioj.day7.BuyBananas; 
 import  java.util.Arrays;  import  java.util.Scanner;  /**
 * @author chuanyi@88.com
 * @date 2020/10/29
 * @Description
 */ 
 public  class  Main  {  public  static  void  main(String[] args)  {  Scanner scan =  new  Scanner(System.in);  String line;  while  (scan.hasNextLine())  { line = scan.nextLine().trim();  String[] strings = line.split(" ");  int[] nums =  new  int[strings.length];  for  (int i =  0; i < strings.length; i++)  { nums[i]  =  Integer.parseInt(strings[i]);  }  System.out.println(buyBananas(nums));  }  }  private  static  int  buyBananas(int[] nums)  {  String[] buyMethods =  enumBuyMethod(nums);  int max =  0;  for  (String buyMethod : buyMethods)  {  String[] numbers = buyMethod.split(",");  int min = nums[Integer.parseInt(numbers[0])];  for  (int i =  1; i < numbers.length; i++)  {  int temp = nums[Integer.parseInt(numbers[i])];  if  (temp < min)  { min = temp;  }  }  int count = min * numbers.length;  if  (count > max)  { max = count;  }  }  return max;  }  /**
     * 枚舉導(dǎo)致內(nèi)存超限,只存下標(biāo)
     * 使用字符串存儲(chǔ)每一種方案中的筐的下標(biāo)
     * @param nums
     * @return
     */  private  static  String[]  enumBuyMethod(int[] nums)  {  int length = nums.length;  int subSetNum =  (int)  Math.pow(2, length);  int temp;  String[] strings =  new  String[subSetNum -  1];  for  (int i =  0; i < subSetNum; i++)  {  if  (i ==  0)  {  continue;  } temp = i;  StringBuilder set =  new  StringBuilder();  for  (int j =  0; j < length; j++)  {  if  ((temp &  1)  ==  1)  { set.append(j);  if  (j < length -  1)  { set.append(",");  }  } temp >>=  1;  }  if  (set.charAt(set.length()  -  1)  ==  ',')  { set.deleteCharAt(set.length()  -  1);  } strings[i -  1]  = set.toString();  }  return strings;  }  }  

時(shí)間復(fù)雜度為 O(2n+1n) 阵子。枚舉的總數(shù)為 2n 思杯,每種方案都需要遍歷數(shù)字的每個(gè)二進(jìn)制位取出對(duì)應(yīng)筐的下標(biāo),這個(gè)長(zhǎng)度是 n 挠进,最后統(tǒng)計(jì)每一種方案對(duì)應(yīng)的香蕉數(shù)也是相同的復(fù)雜度色乾。這樣腾么,時(shí)間復(fù)雜度就是O(2n+1n) 。

空間復(fù)雜度 O(2n-1)=O(2n) 杈湾。一個(gè)用于存儲(chǔ)方案的輔助數(shù)組解虱。

但是這樣的暴力方法會(huì)內(nèi)存超限!F嶙病殴泰!

排序,找短板

有什么其他的辦法嗎浮驳?

題設(shè)說(shuō)悍汛,筐中的香蕉是可以放棄一部分的。 比較容易想到的一點(diǎn)是找到一筐數(shù)量比較少最佳的香蕉至会,然后讓其他的筐都減少到相同的數(shù)量离咐。因?yàn)橄憬吨荒軠p少,不能增加奉件,我們應(yīng)當(dāng)從數(shù)量較少的香蕉筐開(kāi)始宵蛀,讓其余的可能的香蕉筐放棄一部分以達(dá)到相同的數(shù)量。

第一步:從小到大排列香蕉筐

第二部:從小到大遍歷這些筐县貌,讓比當(dāng)前筐多的香蕉都保持相同的數(shù)量术陶,求出可以得到的香蕉總數(shù)。找到這些總和的最大值煤痕。

代碼如下:

package  com.li2niu.mioj.day7.BuyBananas;  import  java.util.Arrays;  import  java.util.Scanner;  /**
 * @author chuanyi@88.com
 * @date 2020/10/29
 * @Description
 */  public  class  Main  {  public  static  void  main(String[] args)  {  Scanner scan =  new  Scanner(System.in);  String line;  while  (scan.hasNextLine())  { line = scan.nextLine().trim();  String[] strings = line.split(" ");  int[] nums =  new  int[strings.length];  for  (int i =  0; i < strings.length; i++)  { nums[i]  =  Integer.parseInt(strings[i]);  }  System.out.println(buyBananas1(nums));  }  }  private  static  int  buyBananas1(int[] nums)  {  Arrays.sort(nums);  int max =  0;  int length = nums.length;  for  (int i =  0; i < length; i++)  {  int count = nums[i]  *  (length - i);  if  (count > max)  { max = count;  }  }  return max;  }  }  

時(shí)間復(fù)雜度是

O(nlogn+n)=O(nlogn) 梧宫。使用的Arrays.sort 時(shí)間復(fù)雜度是O(nlogn) ,遍歷需要O(n) 。

空間復(fù)雜度O(1) 摆碉。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末塘匣,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子巷帝,更是在濱河造成了極大的恐慌忌卤,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,968評(píng)論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件锅睛,死亡現(xiàn)場(chǎng)離奇詭異埠巨,居然都是意外死亡历谍,警方通過(guò)查閱死者的電腦和手機(jī)现拒,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)望侈,“玉大人印蔬,你說(shuō)我怎么就攤上這事⊥蜒茫” “怎么了侥猬?”我有些...
    開(kāi)封第一講書(shū)人閱讀 153,220評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵例驹,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我退唠,道長(zhǎng)鹃锈,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,416評(píng)論 1 279
  • 正文 為了忘掉前任瞧预,我火速辦了婚禮屎债,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘垢油。我一直安慰自己盆驹,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,425評(píng)論 5 374
  • 文/花漫 我一把揭開(kāi)白布滩愁。 她就那樣靜靜地躺著躯喇,像睡著了一般。 火紅的嫁衣襯著肌膚如雪硝枉。 梳的紋絲不亂的頭發(fā)上廉丽,一...
    開(kāi)封第一講書(shū)人閱讀 49,144評(píng)論 1 285
  • 那天,我揣著相機(jī)與錄音妻味,去河邊找鬼雅倒。 笑死,一個(gè)胖子當(dāng)著我的面吹牛弧可,可吹牛的內(nèi)容都是我干的蔑匣。 我是一名探鬼主播,決...
    沈念sama閱讀 38,432評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼棕诵,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼裁良!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起校套,我...
    開(kāi)封第一講書(shū)人閱讀 37,088評(píng)論 0 261
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤价脾,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后笛匙,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體侨把,經(jīng)...
    沈念sama閱讀 43,586評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,028評(píng)論 2 325
  • 正文 我和宋清朗相戀三年妹孙,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了秋柄。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,137評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡蠢正,死狀恐怖骇笔,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤笨触,帶...
    沈念sama閱讀 33,783評(píng)論 4 324
  • 正文 年R本政府宣布懦傍,位于F島的核電站,受9級(jí)特大地震影響芦劣,放射性物質(zhì)發(fā)生泄漏粗俱。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,343評(píng)論 3 307
  • 文/蒙蒙 一虚吟、第九天 我趴在偏房一處隱蔽的房頂上張望源梭。 院中可真熱鬧,春花似錦稍味、人聲如沸废麻。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,333評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)烛愧。三九已至,卻和暖如春掂碱,著一層夾襖步出監(jiān)牢的瞬間怜姿,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,559評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工疼燥, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留沧卢,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,595評(píng)論 2 355
  • 正文 我出身青樓醉者,卻偏偏與公主長(zhǎng)得像但狭,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子撬即,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,901評(píng)論 2 345