2019第十屆藍橋C/C++ B組題解

第一題
490
別看錯17號 一個頂三

第二題
BYQ
36進制

第三題
別用遞歸
答案 4659 如果不模10000,得到的結果千位是0,題目特意告訴千位不爲0

#include<iostream>
using namespace std;
long long  dp[100000000];

int main()
{
	long long a;
	
	cin>>a;
	dp[1]=1;
	dp[2]=1;
	dp[3]=1;
	for(int i=4;i<=a;i++)
	{
		dp[i]=(dp[i-1]+dp[i-2]+dp[i-3])%10000;		
	}
	cout<<dp[a]<<endl;	
	return 0;
 } 

第四題
暴力加優化
答案
//跑個10分鐘

#include<bits/stdc++.h>
using namespace std;
#define N 2019 
void i2s(int a,string &s)
{
   stringstream ss;
   ss<<a;
   ss>>s;
}
bool is(int a)
{
   string s;
   i2s(a,s);
   if(s.find("2")==string::npos&&s.find("4")==string::npos) return false;
   else return true;
}
int main()
{
   int ans=0;
   
   for(int i=1;i<N;i++) //還可以從奇偶來優化 考試的時候沒跑出來 
     {
      if(is(i)) continue;
      for(int j=i+1;j<N;j++)
      {
      	if(is(j)) continue;
      	for(int k=j+1;k<N;k++)
      	{
      		if(is(k)) continue;
      		if(i+j+k==N)
      		{
      			ans++;
   		   }
   	   }
      }
     }
   cout<<ans/6<<endl;//除以6 
   return 0;   
} 

第五題
BFS求解,眼睛都看瞎了

大題:
//求只含2 0 1 9數字的類似上面的string.find的即可,和用long long存儲

//求等差數列的,我的思路是用最大的數減去最小的數, 然後從大到小枚舉公差,此公差從第一項開始的倍數若滿足所給的所有數據,那麼就是使之最短數列的公差,除一下就知道最短多少個了,過了樣例(是不是要考慮公差爲0的情況,忘了)

//完全二叉樹那題,用數組求解即可 1 2 4 8。。。,開一個數組記錄每一層的值,此數組的下標即對應深度,最後將此數組倒着求解最大即可(倒着就可以在相同的情況下,找到深度最小的情況) //(ps:乍一看還想建樹層序遍歷呢)(有負數數據,max不能設置爲0,gg)

//求後綴表達式那題,先排序再將所有的負號個數乘以從第一個開始的數據即可,最後相加 。比如: 排序之後 爲 -10 -5 1 2 3 有 3個負號 一個正號,則爲 10 5 -1 2 3,相加即爲最大,全爲負數 如:-10 -9 -8 -7 -5 三個負號,一個正號也是一樣的 10 9 8 -7 -5 也爲最大(貌似沒說用括號吧)
//星際爭霸那題沒看,字太長了,感覺也不會

有錯誤歡迎指出

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章