洛谷 P2089烤雞

2021-10-02 20:52:07 字數 1742 閱讀 5183

題目背景

豬豬 hanke 得到了乙隻雞。

現在, hanke 想要知道,如果給你乙個美味程度 nn ,請輸出這 1010 種配料的所有搭配方案。

輸入格式

乙個正整數 n,表示美味程度。

輸出格式

第一行,方案總數。

第二行至結束,10 個數,表示每種配料所放的質量,按字典序排列。

如果沒有符合要求的方法,就只要在第一行輸出乙個 0。

輸入輸出樣例

輸入11

輸出10

1 1 1 1 1 1 1 1 1 2

1 1 1 1 1 1 1 1 2 1

1 1 1 1 1 1 1 2 1 1

1 1 1 1 1 1 2 1 1 1

1 1 1 1 1 2 1 1 1 1

1 1 1 1 2 1 1 1 1 1

1 1 1 2 1 1 1 1 1 1

1 1 2 1 1 1 1 1 1 1

1 2 1 1 1 1 1 1 1 1

2 1 1 1 1 1 1 1 1 1

說明/提示

對於 100%100% 的資料,n \leq 5000n≤5000。

思路:一開始我想從n出發,對n-10後的部分進行分配,這樣能計算出方案數,但不容易輸出每個方案,而且沒有考慮美味度上界(30),錯的離譜,,,

這是我最初的錯誤**。

int

main()

;int n,i,j;

long

long

int res=0;

//方案數

//get data

scanf

("%d"

,&n)

;//calculate

if(n==10)

res=1;

else

if(n<10)

res=0;

else

if(n>10)

}}// output result

printf

("%d\n"

,res)

;return0;

}

改正後:

搜到的大佬的答案,**如下:

#include

#include

using

namespace std;

const

int maxn =13;

char ans[

1000000+5

];char

*anscur = ans;

int nums[maxn]

;// 當前調料

int cnt =0;

// 方案數

void

printans()

sprintf

(anscur,

"\n%n"

,&offset)

; anscur +

= offset;

}void

dfs(

int cur,

int left)

int&i = nums[cur]

;// 宣告別名(引用)

for(i =

1; i <=

3; i++)}

intmain()

//最終用時34ms,最長乙個點10ms,快了差不多幾十倍。

正解:深度搜尋 剪枝操作和字串儲存,大大降低複雜度

洛谷 P2089 烤雞

看了前面大佬的 發現這道題的解題思路都大同小異。首先肯定要定義乙個變數累加方案數量,因為方案數量要最先輸出,所以所有方案要先儲存下來。個人不喜歡太多陣列,就只定義乙個字串。然後我們發現只有10種配料,每中在1 3以內,我們便可以模擬一下 制 4 9 262144,在int範圍內 string tot...

洛谷 BOSS戰 入門綜合練習1 P2089 烤雞

洛谷 boss戰 入門綜合練習1 p2089 烤雞 沒有任何思路,看到題解才知道可以用10層迴圈的暴力列舉或者深搜 解法一 暴力列舉 include using namespace std intmain cout 1 a 3 a 解法二 裸深搜 include include using name...

洛谷P5049 洛谷P5022 題解 旅行

原題 資料加強版 加強版 參考你谷題解 終於調過了 又是一如既往的申必錯誤 noi plus石錘了 原題的資料允許我們 o n 2 暴力斷邊,但是加強版的資料達到了 n log n 級別,我們必須在斷邊這一環節尋求更好的解法。考慮我們進入環後在何處回溯 根據繼續走環走到的點分類 設當前已經從 b 走...