暑期集訓2期3

2021-10-23 22:04:00 字數 3200 閱讀 3253

直接列舉−3000到3000也沒關係。

列舉最後的x,容易發現x 的取值不會在序列取值之外。

不開long long 會掛掉30分。

題目大意兩排數,你的目標是將數值相同的放到一起。

滾動不消耗代價。

提起消耗的代價為數值。

你需要最小化提起的數值限制,也就是移動的最大值盡可能小

30分演算法:

一旦乙個數值使用了第二種操作,可以直接把它看成消失了,因為可以不對剩下的數造成任何阻礙。

列舉每個數是否使用第二種操作,然後 check 一下剩下的數對中間是否都沒有障礙數。

時間複雜度o(a2n),期望得分30。

但是你只要想出了第乙個方法,你一般也就不會只有30分,但這都是後話。

60~80分演算法:

考慮一對數,如果它們跨排,那麼一定會使用第二種操作。

如果在同排,達到目標有兩種方案:自身使用第二個操作或是中間的所有數都使用了第二個操作。

• 問題轉化為了區間取max。直接迴圈掃,期望得分60∼80。

100分演算法1:

使用一些方法優化到o(nlogn) 就可以獲得滿分。

#include

#define maxn 1000010

using

namespace std;

inline

intread()

while

(isdigit

(ch)

)res=

(res<<1)

+(res<<3)

+(ch&15)

,ch=

getchar()

;return res*f;

}int n,nans[maxn]

,top;

int a[maxn]

,b[maxn]

;int ans;

int a[maxn]

,b[maxn]

;inline

bool

check

(int x)

intmain()

for(

int i=

1;i<=n;i++

)long

long l=

0,r=

1e9;

while

(l<=r)

//二分

40分演算法:一看就是dp

• 令fi表示以 i 結尾的字首的答案。列舉j#include

30分演算法:

直接暴力列舉所有可能的 01 串,並計算它與每個已有 01 串的距離,期望得分30。

基於原來30分的演算法。

對於20% 的特殊性質資料部分,直接輸出1 2 即可。

100分演算法:

將題目看成是一張 2m 個點的圖,讀入的 n−1 個 01 串是起點。

每個點都與與自己只差一位的點有連邊,邊權為1。

要找 dist 最大的點,並輸出個數。

直接 bfs 即可獲得滿分。

#include

using

namespace std;

inline

intread()

int ans,tot;

string s;

int n,m,vis[

100010

],dp[

100010];

queue<

int>q;

intmain()

while

(!q.

empty()

)}} cout<

' '<

return0;

}

文獻參考:參

暑期集訓2期5

小李是希望小學六年級的學生,在一次數學課上,張老師出了一道題,小李很快就答出來了。這個題目是這樣的 給定乙個正整數 n,請求出 2 n之間長度最長的 成等差數列的素數 質數 例如 當 n 的值為 40 時,在 2 40 之間的全部素數有 2 3 5 7 11 13 17 19 23 29 31 37...

暑期集訓2期6

如果二叉樹的左右子樹的結構是對稱的,即兩棵子樹皆為空,或者皆不空,則稱該二叉樹是對稱的。程式設計判斷給定的二叉樹是否對稱。例 如下圖中的二叉樹t1是對稱的,t2是不對稱的。二叉樹用順序結構給出,若讀到 則為空,二叉樹t1 abcde,t2 abcd e,如果二叉樹是對稱的,輸出 yes 反之輸出 n...

暑期集訓2期4

把已經買過的遊戲給標記一下,然後從第一款遊戲開始買,如果還可以買並且沒有被標記過那麼買 include using namespace std long long n,ans,num,x struct node a 100010 inline intread while isdigit ch res...