蒜頭的數學實在是太差了,於是老師把他關到小黑屋讓他閉門修煉。老師跟他一張紙,上面一排寫著1, 2, 3…n這n個數,中間用空白分隔。老師讓他在空白處填上加號或者減號。他讓蒜頭君求出一共有多少種加運算子的方法使得整個表示式的值為0,並輸出所有的方案。比如n=7時,1 2 3 4 5 6 7排成一排,一種插入符號的方案為1+2-3+4-5-6+7=0。是不是很有趣,快來幫蒜頭君解出這題吧(*´▽`)ノノ
輸入為一行,包含乙個整數n(3≤n≤9)。
輸出為所有在每對數字間插入「+」或「-」後能得到和為零的數列,並按照字典(ascii碼)序排列。如果無解就輸出一行none。
不知道字典序和ascii也不要緊,我們看樣例輸出就清楚啦,1到n排成一排,先每個位置優先放」+」,再放」-「,這麼放的原因是因為」+」的ascii碼要比」-「小。
1+2-3+4-5-6+7
1+2-3-4+5+6-7
1-2+3+4-5+6-7
1-2-3-4-5+6+7
#include
using
namespace
std;
int n; // 儲存讀入的整數n
bool opr[10]; // 可以用乙個bool陣列儲存所有n-1個符號,我們用true表示加號"+",用false表示減號"-"。
bool found = false
// 表示是否找到一組解,如果沒找到的話需要在最後輸出"none"
// dfs函式,儲存兩個狀態:deep表示遞迴深度,就是列舉到第幾個數字左邊的符號;sum表示之前部分表示式的值。
// 如果列舉完成後sum的值剛好為0,則輸出這組方案。我們需要在搜尋的過程中用opr陣列儲存狀態。
void dfs(int deep, int sum)
}return ;
}// 請在下面的語句中填出正確的邏輯。
opr[deep] = true;
dfs( deep+1,sum+deep+1 );/*如果使用了加號,那麼sum的值就是增加了deep+1(表示加上資料的大小)*/
opr[deep] = false;
dfs( deep+1,sum-deep-1 );/*如果使用了減法,那麼sum的值就是減少了deep+1(表示減去資料的大小)*/
}// main函式請自己完成哦,加油~
int main()
return
0;}
注意這裡的opr陣列只開到了10,當輸入得資料超過10的話就容易出錯了。 計蒜客 程式設計競賽入門
蒜頭君前幾天把最心愛的小麥手機摔壞了,新手機又要好幾天才能到貨,於是蒜頭君不得暫時用它珍藏已久的諾雞鴨非智慧型手機了。手機的儲存空間非常小,以至於未接來電 已接來電和已撥 都只能各自儲存最近的10條記錄。蒜頭買了手機以後的未接來電 已接來電和已撥 記錄全部給出。機智的蒜頭能夠猜到這個手機使用了迴圈佇...
計蒜客 程式設計競賽入門
蒜頭最近在沉迷 尤其是人物關係複雜的言情 它看到的人物關係描述得很的麻煩的時候覺得非常蒜疼,尤其是人物關係裡有冗餘的時候。什麼是冗餘關係呢?這篇 裡有n句描述人物關係的句子,描述了n個人的關係。每條句子的定義是這樣的 x y 它的意思是 x認識y,y也認識x 我們認為 中的人物關係是具有傳遞性的,假...
計蒜客課程競賽入門 堆排序 流程記
堆實際上是一顆二叉樹,對於大根堆來說,它的特點就是父節點的值大於所有子節點的值。c 的stl中priority queue已經幫我們實現好了堆的資料結構,接下來我們一起學習並實踐如何實現乙個堆並用堆進行排序。priority queue是stl的queue這個標頭檔案中定義的資料結構,因此需要額外引...