【藍橋杯考前突擊】第十一屆藍橋杯校賽模擬C/C++ 正整數序列

螢火~kison發表於2020-10-15
問題描述
  小明想知道,滿足以下條件的正整數序列的數量:
  1. 第一項為 n;
  2. 第二項不超過 n;
  3. 從第三項開始,每一項小於前兩項的差的絕對值。
  請計算,對於給定的 n,有多少種滿足條件的序列。
輸入格式
  輸入一行包含一個整數 n。
輸出格式
  輸出一個整數,表示答案。答案可能很大,請輸出答案除以10000的餘數。
樣例輸入
4
樣例輸出
7
樣例說明
  以下是滿足條件的序列:
  4 1
  4 1 1
  4 1 2
  4 2
  4 2 1
  4 3
  4 4
評測用例規模與約定
  對於 20% 的評測用例,1 <= n <= 5;
  對於 50% 的評測用例,1 <= n <= 10;
  對於 80% 的評測用例,1 <= n <= 100;
  對於所有評測用例,1 <= n <= 1000。
為什麼這幾天腦袋這麼好使
以前總是笨笨的
......
這個題一看就知道
絕對不能完全做出來
估計又得是dp之類的演算法了
反正也不會
來暴力一波
暴力的方式也很多
你喜歡哪種呢
我個人大多數情況下使用dfs
偶爾也會使用for,while之類的迴圈
這個題
我們們還是用dfs吧
經過20分鐘到30分鐘的斟酌
程式碼出來了
對於評測樣例的話
我試了試
20左右的數
完全可以規定時間出結果
意味著可以拿到一般分
開心啊
真希望腦袋一直這麼好使
#include<iostream>
#include<cmath>
using namespace std;
int n;
int ans;
void dfs(int last,int now){
	//第三項以後使用搜尋的方式 
	//此方法難點在於何時結束
	//經過斟酌,發現並不需要設定結束條件。只需要放置好ans位置即可 
	for(int i=1;i<=n;i++){
		if(i<abs(now-last)){
			//ans放在這裡是因為每往後走一步,但凡它滿足i<abs(now-last),它就是新的一項 
			//這也是從樣例觀察出來的,所以觀察樣例對解題也很重要,特別是這道題 
			ans++;
			ans=ans%10000;
			dfs(now,i);
		}
	}
}
int main(){
	cin>>n;
	//先確定第一項和第二項
	for(int i=1;i<=n;i++){
		dfs(n,i);
		ans++;
		ans=ans%10000;
	}
	cout<<ans<<endl;
	return 0;
} 

有問題可以留言交流٩(๑❛ᴗ❛๑)۶

相關文章