三重for迴圈列舉即可
這是一道dp題,設狀態dp[i]為長度為i的完美字串,所以有:
所以狀態轉移方程:dp[i]=dp[i-1]+dp[i-2].
stl**,將每個字串放入的集合set裡,然後輸出集合的大小即可。
貪心,要這樣想,如果你們進行了m個回合,這m個回合你都贏了,且第i回合你出的牌為b1,b2,bm,你的摯友出的牌為a1,a2,am,則有你的得分(b1+b2+,+bm)-(a1+a2+,+am);所以你要最大化盡可能增大(b1+b2+,+bm)的同時要盡可能減小(a1+a2+,+am)。要如何實現這種貪心,只需要將b的逆序和a的正序比較即可。
核心**:
sort
(a+1
,a+1
+n);
sort
(b+1
,b+1
+n,cmp)
;//cmp是逆序比較函式
long
long num=0;
for(
int i=
1;i<=n;i++)}
cout<經典的bfs題型,如果是因為不熟悉bfs的實現而導致沒能把這道題解出來,那還是能夠理解,如果是想不到用bfs或不知道如何去bfs,那你此時就應該去學習一下bfs等相關知識了。
從起始位置一直bfs,如果能走到目標點,便可提前退出bfs,到達某乙個點需要的能量是上乙個點的能量+1.所以可以開乙個陣列記錄馬到達每個點消耗的能量。
int next1[8]
[2]=
,,,,
,,,}
;//馬能走的八個方向
struct point //點
;queueq;
//佇列,用於bfs
int arr[
405]
[405];
//記錄每個點耗費的能量
q.push()
;arr[a]
[b]=1;
//將初始位置消耗的能量置為1而不是0,這是乙個小技巧,
//因為bfs需要判斷有沒有走過重複的點,所以置一則可以避免再開乙個陣列去記錄該點有沒有被走過
//因此,輸出時需要輸出arr[x][y]-1.
bool f=0;
while
(!q.
empty()
)); arr[nx]
[ny]
=arr[p.x]
[p.y]+1
;if(nx==x&&ny==y)}if
(f)break;}
cout<[y]-
1<這是道較為麻煩的模擬題,雖然題目叫做「對稱日」,但其實是求回文日期。那麼便可以遍歷年份,依據年份得到乙個日期,該日期是否合法。例如2023年,那麼它對應的回文日期理論是12344321,顯然這個時期不合法(沒有2023年43月21號這個日期),則現在繼續遍歷直到找到乙個合法的日期。而xy對稱日則是增加了年份必須為xyxy形式(形如2020,2121,1212)的限定。
所以該題需要解決的問題便是根據年份求出回文日期,判斷該日期是否合法。
因為資料範圍的原因,所以不能用最長上公升子串行來解(o(n^2)會超時)。當然oi賽制應該還是可以用這個解來騙一些分的(嘻嘻)。那麼需要換一種思路,我們觀察滿足題意的子串行形式,一定為00…0011…11。前面一堆0加後面一堆1。那麼我們便需要找到這個0和1的交界點。我們對0求字首和和對1求字尾和,列舉交界點找出最大的那個。
作為壓軸題,這道題確實有難度。這道題有興趣的可以看我的**自己琢磨一下。後面花時間我講一下。
#include
#include
using
namespace std;
int dp[
2505];
intmain()
sort
(a,a+n)
;int ans1=
0,ans2=0;
for(
int i=
1;i<=
2500
;i++)}
if(f)
else}if
(maxn) cout<<
"inf"
cout
}
記錄藍橋杯校內選拔複習
總體來講,假複習。回顧了筆記和演算法競賽入門的ppt和自己大二第一學期寫的演算法題,但都是大概去理解了下,感覺就像高中考數學似的,去看看概念,然後到考試之後啥都不會。儘管是假複習,但還是有點心得的。三 演算法理解 1 動態規劃 自下而上,大問題分解為小問題,且大小問題有關聯。例題 石子合併,割繩子,...
藍橋杯校園選拔之位平方和
把乙個整數的每個數字都平方後求和,又得到乙個整數,我們稱這個整數為 位平方和。對新得到的整數仍然可以繼續這一運算過程。比如,給定整數為4,則一系列的運算結果為 16,37,58,89,本題的要求是,已知乙個整數x,求第n步的運算結果。資料格式要求 輸入,兩個整數x n,中間以空格分開。表示求x的第n...
藍橋杯校內選拔賽C C 高職組
二項式的係數規律,我國數學家很早就發現了。如 圖1.png 我國南宋數學家楊輝1261年所著的 詳解九章演算法 一書裡就出現了。其排列規律 11 1 1 2 1 1 3 3 1 1 4 6 4 1 1 5 10 10 5 1 1 6 15 20 15 6 1 1 7 21 35 35 21 7 1 ...