題目背景
豬豬 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 走...