國色天香(火柴,c )

2021-07-24 15:35:00 字數 1825 閱讀 3376

國色天香(match.pas/c/cpp)

庭前芍藥妖無格,池上芙蕖淨少情。唯有牡丹真國色,花開時節動京城。

——唐· 劉禹錫《賞牡丹》

芍藥花再紅終究妖豔無格。終不及牡丹,國色天香。

——烏拉那拉氏宜修

華妃總是想要用自己的氣焰打壓皇后,正好有一天,皇上有興趣來玩乙個火柴遊戲,讓華妃和皇后都來參與。規則如下:這是火柴所形成 9 個數字的方式,每個數字所需的火柴數量不一樣。現在皇上給每個人發了 n 根火柴,華妃要擺出其所能擺出最小的數,而皇后則需要擺出其所能擺出的最大的數。當然,皇上是不容糊弄的,前導 0 或者擺出不規則的數字什麼的都算是作弊。獲勝者的獎勵則是皇上今晚會翻她的牌子。現在皇后與華妃都使出渾身解數,而在一旁**的甄嬛則想盡快知道答案。

是了,老師出的題比較奇葩……

這道題我個人覺得是貪心。

且聽王三歲解釋一下:

1.每乙個數字的所用火柴棒數量是固定的,也就是我們可以分為10種情況——雖然10種情況並不多,可是有很多個人感覺用不到

2.最大最大最小值有一定的特殊性,我感覺是有規律的

3.最重要的是……用dp和圖論感覺大材小用了,而列舉就是10^10,超了而且寫著煩  (´д` )

那麼我們來探索一下最大最小值的特殊性:

最大值:

1)很容易想到要用最少的火柴來拼最大的數字

2)從常識的角度來看,位數越多拼出的數字就越大

3)從數學的角度來講,越大的數字放在越高的位上數字整體就會更大

分析完以後

我們可以這麼寫

首先找到火柴的總數n

因為最少需要兩個火柴能拼出一位數1

所以先除二

附**:

int a[10001]=;

int max(int n)

c=n%2;

if(c==1)

return lenth;

}

好了以上是求最大值。

接下來是最小值:

1)首先是位數最少;

2)每一位盡可能多的消耗火柴;

3)小的盡量排前面;

每一位能消耗的最大值就是7根火柴,召喚出乙個8(莫名中二病犯了)

然後我們同樣取餘數c

這個時候就有趣了:

如果餘數為3:

1)如果剩乙個八:從8拿兩個火柴可以組成22而不是78

2)如果剩兩個八:從兩個8拿兩根火柴可以組成200

如果餘數為4:

1)如果有乙個八:取乙個變成20而不是48

如果餘數為6:

1)如果為第一位:取6而不是0

如果餘數為1:

1)如果有乙個八:取乙個變成10

附上召喚王三歲的**:(為方便可讀性沒有簡化**)

int b[1001]=;

int min(int n)

c=n%7;

if(c==0)

if(c==3)

if(lenth==1)

if(lenth==0)

}if(c==4)

lenth++;

b[lenth]=4;

return lenth;

} if(c==6)

if(c==1) }

else

if(c==5)

return lenth;

}}

好了這是最符合剛剛思考過程的**。

當然還有簡化版只有35行(然而因為思路會有所改動所以沒給出)

lenth被返回後倒序輸出b陣列即可

好了王三歲講完了

謝謝**♪(´ε`) 



C51寫國色天香(前幾句沒寫完) 中斷編號問題

include define uchar unsigned char define uint unsigned int sbit buzz p2 2 int x uchar code music uchar code frequency 頻率陣列 void delayms uint z void m...