codeforces 977非官方題解

2021-08-19 19:00:28 字數 3368 閱讀 6797

打了差不多一年的cf發現自己是div3選手,也可能是div4+選手。

這一題就是簡單的模擬題。

#include 

using

namespace

std;

long

long main() else

}cout

<< n << endl;

return

0;}

這題是說要算一下哪個長度為2的子串出現次數最多,那麼就統計一下吧。

#include 

using

namespace

std;

const

int maxn = 30;

int cnt[maxn][maxn];

char ss[110];

int main()

int mx = -1;

int ii = -1;

int ij = -1;

for(int i = 0; i < 26; i++) }}

printf("%c%c", ii+'a', ij+'a');

return

0;}

這題的主要問題在於,可能有一點點小的細節。

另外還有乙個問題是,如果不認真看題,可能會以為要找出乙個嚴格大於k個數的數出來,而不是大於等於,至少我是這麼看錯的。看錯的原因是,給的樣例恰好是大於的。具體的細節請看**。主要是要特判k==0。

**寫的有點蠢,但是還是過了。

#include 

#include

using

namespace

std;

const

int maxn = 2e5 + 10;

const

int inf = 0x3f3f3f3f;

int a[maxn];

int main()

a[n+1] = inf;

sort(a + 1, a + n + 1);

if(k == 0) else

return

0; }

int cnt = 0;

int t = a[k];

int index = k;

int tem = k;

for(int i = k + 1; i <= n; i++) else

}if(index == k) else

return

0;}

這題我感覺我寫了乙個假演算法啊,但是不知道為什麼能pp。結果最後還是過了。。不是很懂

大概思路是,先預處理出乙個後面可以接哪乙個。b陣列表示後面接哪個,c陣列表示前面接哪個。

後來請教了一下,發現我這個演算法沒有問題。

事情是這樣的,可以發現,對於這堆數,每個數都可以表示為a∗

2x∗3

y a∗2

x∗3y

,只有x和y是變化的,而x變大,y變小,所以應該是乙個雙關鍵字排序,至於這個排序怎麼排,也是有講究的,比如說你真的算出x和y,然後排序,這個可以,但是實際上算出乙個就夠了,因為因數分解下來的那個a是一樣的。由於題目保證了有解,所以我這裡的做法,就恰好也保證了排序。

#include 

#include

using

namespace

std;

int n;

long

long a[110];

int b[110];

int c[110];

int main()

for(int i = 1; i <= n; i++) else

if(a[i] * 2 == a[j]) }}

int ss = -1;

for(int i = 1; i <= n; i++)

}while(ss != 0)

return

0;}

這道題的思路可以是這樣的:

找出所有的聯通塊。這裡可以用dfs來實現。

把判斷每個聯通塊是不是都是合法的。我同學講說看邊數與點數是否相等,這個實現起來應該也不難,應該也是對的吧。還有一種做法是,判斷每個點的度是否為2.

#include 

#include

using

namespace

std;

const

int maxn = 2e5 + 10;

vector

v[maxn];

vector

g;bool used[maxn];

void dfs(int x)

}}int main()

int cnt = 0;

for(int i = 1; i <= n; i++)

g.clear();

dfs(i);

bool ok = true;

for(int ii : g)

}if(ok)

}printf("%d", cnt);

return

0;}

我的想法是這樣的:

用dp[x]表示以x為結尾的串的長度,那麼如果出現了乙個數x,那麼這時候更新dp[x],dp

[x]=

max(

dp[x

−1]+

1,dp

[x])

d p[

x]=m

ax(d

p[x−

1]+1

,dp[

x]

)。然後有一種像我這樣很蠢但是也是很簡單易懂的做法是,這時候已經知道子串的所有元素資訊了,那麼在原來的串中找出來就行了。子串的第乙個元素是x−

dp[x

]+1 x−d

p[x]

+1

,然後依次在數列中找出大乙個的數。

#include 

#include

using

namespace

std;

const

int maxn = 2e5 + 10;

map dp;

int a[maxn];

int main()

int mx_cnt = -1;

int mi = -1;

for(auto a : dp)

}int cnt = mx_cnt;

printf("%d\n", cnt);

int num = mi - cnt + 1;

for(int i = 1; i <= n; i++)

}return

0;}

codeforces 977F dp回溯路徑

題意 找出子串行中,連續嚴格上公升的序列的最大長並列印位置。這裡dp i 表示第i個結尾的最大上公升長度。dp i max dp i 1 1 這裡a i 很大,我們採用map。題目要求列印路徑我們就記錄乙個前驅 我這裡寫的略顯臃腫,腦子抽了 include include include inclu...

977 有序陣列的平方

利用 陣列 nums 已經按照公升序排序 這個條件。顯然,如果陣列 nums 中的所有數都是非負數,那麼將每個數平方後,陣列仍然保持公升序 如果陣列 nums 中的所有數都是負數,那麼將每個數平方後,陣列會保持降序。因此就可以使用歸併的方法進行排序。使用兩個指標分別指向位置 0 和 n 1,每次比較...

977 有序陣列的平方

題意理解 給定遞增陣列,把陣列元素平方後遞增輸出。思路 可能含有負數,但是存在乙個負數和正數的分界線neg。利用雙指標,從neg和neg 1向兩邊遍歷,把小的push進ans中,直至到達一邊的邊界,這時把另一邊剩下的順序push進ans中就可以了。麻煩的地方在於要做邊界 檢查。另一種反向思路 雙指標...