題目:
題目說兩個分值的差不等於k,也就是說兩個分值的差為k可以匹配,噢,這不就是等差數列嘛,是不是,你看:
對於樣例來說; 進來的乙個1。
1+0=1,計數,這就是乙個答案,將這個結果標記,如果後面的有這個數就不計數了,
..............
一直這樣下去,最後得到的結果不就是答案了麼。如果這樣的做得人,我問一下如果輸入
你得到什麼,嘿嘿,做錯了吧,如果這麼想的人呢,只可能對一丟丟。
有人可能想到搜尋,是啊,我可以搜尋,我將乙個數放入bag[ ] ,再對下乙個進入的數進行檢查 ,檢查可不可以放進去,但是有沒有注意到資料的大小,這樣下去tle是遲早的事(有這樣的想的人嗎?嘿嘿.....)
搜尋會超時,那麼我們換乙個,既然想到了等差數列,我們順著想下去,對於之前的例子
如果進行去重複呢,將這些數用num陣列儲存,用cnt陣列記下每乙個數的個數,將會得到 1 4 6 其數量為1 1 2 ,我們既然也想到搜尋,那麼轉到dp 試試,相差為2的不能取,取的話,如果要這個數,和不要這個數,這兩個所帶的數量哪乙個最大,dp一下,那麼這個時候有些人就知道對不對( (* ̄︶ ̄) 哈哈哈),哎呀,還不知道的人再想想。。。。。。。。。。。。。。。。。。。。。
沒錯,就是相鄰的兩個數是不能取的,正是因為這樣,所以我們得出它的轉移公式為
既然這樣,我們看一下還可以不優化一下,如果我令k=1的時候進行dp ,一直到k<2,將這些每一次的數相加,所得到的數相加,也是可以的。
噢噢噢,差一點,不要忘記對k=0 時候特判哦,為什麼呢,你想想不就是不要重複的數嘛。
那麼拿出我的ac(醜陋的)**;
#includeusingnamespace
std;
const
int n=100000+10
;int
dp[n],cnt[n],value[n];
int n,k,res=0,maxn=0
;int dp(int
k)
else
res+=dp[m-1
]; }
}return
res;
}int
main()
dp(k);
cout
return0;
}
藍橋杯 2023年第八屆真題 對局匹配
我們可以按照要求將分數分成不同組,同組內的資料相鄰元素差值為k。例如樣例2 10 1 2 1 1 1 1 4 4 3 4 4我們可以分出一組 1,2,3,4 這樣的目的是為了便於選取,因為相鄰元素差值為k,所以我們就可以進行跳躍式選取,也就是如果當前決定第i位的值,我們可以選擇選取第i位,這樣就從第...
藍橋杯 2023年第八屆真題 對局匹配
我們可以按照要求將分數分成不同組,同組內的資料相鄰元素差值為k。例如樣例2 10 1 2 1 1 1 1 4 4 3 4 4我們可以分出一組 1,2,3,4 這樣的目的是為了便於選取,因為相鄰元素差值為k,所以我們就可以進行跳躍式選取,也就是如果當前決定第i位的值,我們可以選擇選取第i位,這樣就從第...
藍橋杯 2023年第八屆真題 對局匹配
我們可以按照要求將分數分成不同組,同組內的資料相鄰元素差值為k。例如樣例2 10 1 2 1 1 1 1 4 4 3 4 4我們可以分出一組 1,2,3,4 這樣的目的是為了便於選取,因為相鄰元素差值為k,所以我們就可以進行跳躍式選取,也就是如果當前決定第i位的值,我們可以選擇選取第i位,這樣就從第...