國色天香(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...