藍橋杯 2023年第八屆真題 對局匹配

2022-05-01 13:30:08 字數 1972 閱讀 7980

題目:

題目說兩個分值的差不等於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(醜陋的)**;

#includeusing

namespace

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位,這樣就從第...