2018 藍橋杯省賽 B 組模擬賽(一)

2021-09-12 21:09:19 字數 1977 閱讀 1010

給你乙個序列,請你在其中求出一段最長嚴格上公升的部分,它不一定要連續。

#include#includeusing namespace std;

int f[10000], b[10000];

int lis(int n) }}

res = max(res, f[i]);

}return res+1;

}int main()

printf("%d\n", lis(n));

return 0;

}

我們要找的是全排列中,排列結果互不相同的個數。比如:aab 的全排列就只有三種,那就是aab,baa,aba。

#include #include #include #include #include using namespace std;

const int n=1e3;

char str[n], buf[n];//buffer

int vis[n], total, len;

void arrange(int num)

for (int i = 0; i < len; ++i)

}if (j == len) }}

}int main()

return 0;

}

先想一下簡化的問題吧,假如輸入的字串不重複,例如abcd,那麼就是簡單的

dfs了,乙個for迴圈加乙個vis判斷,如果判斷可以,繼續遞迴。當有重複的字元時候就比較麻煩了,比如aab,單純的用遞迴會輸出重複的。那麼怎麼加上限定條件呢。

這裡,我們讓重複的這些字元只順序輸出一遍,這樣就不會重複

這是什麼意思呢,比如說aabc,我們只允許第乙個a訪問後再訪問第二個a,不允許訪問第二個,再第乙個。再如,abacda,那三個a只能按順序訪問。

原理是什麼呢,用了點高中學的排列組合的知識,先排重複的,例如我們搞abacda這例子, 先排三個a, 就是 aaa,那麼剩下的就相當於直接插入到aaa中,那麼如果我們aaa如果按多種順序排,就會產生多種結果,所以只能按順序訪問。

那麼又如何用演算法實現呢,直接加個if判斷就行了,判斷i之後的有沒有訪問過的且相等的。例如,aabc這個例子,我們第一輪選完之後,到了第二個a,然後進入遞迴,for迴圈又從0開始,到了第乙個a,然後從這個之後去判斷有沒有訪問過的a,結果判斷有,違反了順序,所以結束。

這個題目的關鍵也就是排除重複的

#includeusing namespace std;

int mp[90][90];

int hs(int x , int y , int i)

return 1;

}int jiu(int x, int y, int n)

return 1;

}bool dfs(int cen)

}else return dfs(cen +1);//如果已經填入數字,搜尋下乙個,這裡的返回很有靈性。

return false;

}int main()

}cout << endl;

dfs(0);//從第乙個開始搜尋

for(int i = 0; i < 9; i++)

return 0;

}

解題思路:dfs深度填數檢測+回溯法

1,先把有數字的地方設定標記位為true1

2,迴圈遍歷陣列中沒有標記位true1的地方,也就是需要填數的地方

如果當前為0,即a[i][j]==0,判斷當前所在的九宮格,然後從數字1-9依次檢測是否在行、列、宮中唯一

滿足唯一的話,則吧數字賦值給a[i][j]=l+1;然後繼續深度遍歷為true1的話就返回true1,否則回溯a[i][j]==0等

如果當前沒有0,說明都已經填滿且符合唯一條件,則返回true1;結束

2019 藍橋杯省賽 B 組模擬賽(一)

d.結果填空 馬的管轄 e.填空 lis f.程式設計 找質數 思路 因為時間複雜度的問題,o n n 的時間複雜度可能會超時,可以選擇的篩選素數的方法有埃氏篩法o n logn 尤拉篩法,這裡選的是尤拉篩法o n 直接遍歷找兩個素數相加等於n 因為要求字典樹最小,所以不會超時 ac include...

2018 藍橋杯省賽 B 組模擬賽(一) 數列求值

對於乙個含有 n 2n 2 個元素的數列,a 0,a 1,cdots a na0 a1 a n 滿足這樣的遞迴公式 displaystyle a i frac a c i 1 le i le nai 2a i 1 ai 1 ci 1 i n 現在我們知道 a 0,a a0 an 1 和 c 1,c ...

2018 藍橋杯省賽 B 組模擬賽(五)整數劃分

蒜頭君特別喜歡數學。今天,蒜頭君突發奇想 如果想要把乙個正整數 n n 分解成不多於 k k 個正整數相加的形式,那麼一共有多少種分解的方式呢?蒜頭君覺得這個問題實在是太難了,於是他想讓你幫幫忙。共一行,包含兩個整數 n 1 leq n leq 300 n 1 n 300 和 k 1 leq k l...