暑假訓練總結第1周第一天

2021-10-07 19:52:24 字數 4460 閱讀 9131

題意:

a(codeforces - 1272f):兩個括號字串是s、t,製造乙個最短的括號字串並使得s和t是它的字串(s和t可以不連續)。

b(codeforces - 1272d):最多刪除陣列中的乙個元素,求操作後的最長單調增序列的長度。

c(codeforces - 1272a):三個數,分別可以加

一、減一或者不變。求三者操作後分別兩兩做差的絕對值之和的最小值。

d(codeforces - 1272e):長度為n的數列ai,每個位置i可以跳到i-ai或i+ai的位置。要求i和經過任意次跳躍後的位置的奇偶性不同。

e(codeforces - 1272c):求有限個字元在字串s中的子串個數。

f(codeforces - 1272b):在對原串進行刪除和重排後,求最長的字串,使得機械人經過字串的要求移動後能回到原點。

補題:a:codeforces 1272 f. two bracket sequences

dp[i][j][k]表示匹配到s的第i個字元,匹配到t的第j個字元,並且此時(的個數比)多k個的時候的最小合法序列長度,k的上限是200(s和t中最多200個(或者))。

狀態轉移:

列舉答案合法序列的每一位放置(或者)

放置(,如果s[i]== 『(』 -> ni=i+1,t[j]==』(』 -> nj=j+1, dp[ni][nj][z+1]=dp[i][j][z]+1

放置),如果s[i]== 『)』 -> ni=i+1,t[j]==』)』 -> nj=j+1, dp[ni][nj][z-1]=dp[i][j][z]+1

整個過程需要滿足0<=z<=200 下界是因為z<0時左括號個數小於右括號個數將無法形成合法序列。每乙個步轉移需要記錄父節點座標和父節點通過什麼字元轉移到當前狀態,最終狀態為dp[s.size()][t.size()][0],從這個狀態沿著父節點回退到dp[0][0][0]。

**:

#include

#include

#include

using

namespace std;

const

int maxn=

210;

const

int inf=

0x3f3f3f3f

;int dp[maxn]

[maxn]

[maxn]

;struct nodest[maxn]

[maxn]

[maxn]

;string s,t;

int sz,tz;

int nx,ny,nz;

inline

void

bfs())

;while

(!q.

empty()

)); st[nx]

[ny]

[nz]

=node;}

//) nx=tp.x+

(tp.x==')');

ny=tp.y+

(tp.y==')');

nz=tp.z-1;

if(nz>=

0&&dp[nx]

[ny]

[nz]

==inf));

st[nx]

[ny]

[nz]

=node;}

}}intmain()

sz=res.

size()

;for

(int i=sz-

1;i>=0;

--i)cout<; cout

}

b:codeforces 1272d yet remove one element(ac)(暴力轉dp)

思路:一開始想著三重迴圈,i表示刪除的位置,j表示起始位置,k表示從j開始找遞增子列。考慮到超時的可能性,在第一次錯了之後,還是決定變換整體思路,現在想想,可能是邊界的問題。之後想到用兩個dp陣列來記錄第i個的遞增個數和記錄最大情況。但提交的時候應該是2個dp陣列賦初始值的是時候有點差異(乙個是先在外面賦值1,另乙個是在裡面判斷在賦值),test5過不去,有點懵…

**:

#include

using

namespace std;

int x[

200010

],y[

200010

],a[

200010];

intmain()

y[n]=1

;for

(int i=n-

1;i>

1;i--

)int ans=1;

if(a[1]

) ans=x[1]

+y[2];

for(

int i=

3;i<=n;i++

) cout

}

c:codeforces - 1272a three friends(ac)(暴力)

思路:一開始就想用三個數的平均數的上取整來比較判斷,沒過。然後就三重迴圈暴力求了(ans最大值的取值一開始取小了,模擬的時候貪了,沒模擬到測試裡的最大值,導致沒看出來)。

**:

`#include.h>

#define max 3000000010

using

namespace std;

int q,a,b,c;

long

long ans,sum;

int main (

) c=c-3;

} b=b-3;

} cout<}}`

d:codeforces - 1272e nearest opposite parity

思路:反向建邊,直接將所有的奇性點入隊,然後bfs,依次遍歷到的偶性點 的 步數,即為結果。再同樣跑一遍偶性點

**:

#include

using

namespace std;

const

int maxn=

2e5+

100;

const

int inf=

0x3f3f3f3f

;int arr[maxn]

;int ans[maxn]

;vector<

int>edge[maxn]

;int n;

void

solve

(int flag)

}while

(!q.

empty()

)}}for

(int i=

1;i<=n;

++i)

}int

main()

if(i+arr[i]

<=n)

}solve(1

);solve(0

);for(

int i=

1;i<=n;

++i)

return0;

}

e:codeforces - 1272c yet another broken keyboard

思路:先找乙個符合條件的最長連續字串,再用等比數列求和公式,注意資料型別用long long。

**:

#include

using

namespace std;

long

long n,k,sum,f,ans,b[27]

=;string s;

char a[27]

,x;int main (

)for

(int i=

0; ians=ans+sum*

(sum+1)

/2; cout<}

f:codeforces - 1272b snow walking robot

思路:想要回原點,那l和r數量需要相等,且u和d數量需要相等。分兩種情況考慮:如果豎直方向或水平方向不可以移動,那只能移一次水平或者豎直方向;否則移個正方形即可

**:

#include

#include

using

namespace std;

int main (

)int x=

min(l,r)

,y=min

(u,d);if

(x==0)

else

if(y==0)

else

}}

感想:在早上的比賽後,過了bc兩題,嘗試過一題。嘗試的e題感覺把自己騙了,只考慮了暴力的演算法在tel之後沒有繼續去考慮優化的方法,轉而去做別的題,有點可惜,畢竟事後發現挺簡單的。c題主要是細節的問題沒出來好,小錯誤導致白白wa了兩次。沒有全部看一遍的原因應該還是想慢了,在bc題的優化還是花太多時間了,而且現在看了ad的題解後,確實感覺自己的能力有點不足,還要繼續補充專業的一些知識點。

暑假訓練第三週第一天

題意 b codeforces 1238d 給你乙個只包含ab的字串,問你有多少個回文子字串。c codeforces 1238a 兩數之差是否能分解成乙個素數的若干倍。d codeforces 1238c 在h的高度 此處有踏板 character只能跳一層樓或者兩層樓,每在乙個h高度時,可以按動...

暑假部落格 ML第一天

2兩種基本的ml型別 unsupervised learning非監督學習 3cost function代價函式這個翻譯的不形象 重點是,監督學習中,給定了學習資料的答案,要求學習後能給出按照要求的答案型別 有多少,是否是 通過資料和答案學習。在andrew ng 的例子中,主要是從點陣中,得出自變...

2012暑假培訓第一天

今天8.10 哦,突然想起來現在已經是11號了。以後給自己乙個目標,每天發布下一天學的東西。總結下收穫,還有不足。首先,早上去聽了下前端的課 主要是複習了一下html標籤 這是今天上課講的標籤的資料 還有框架frameset標籤的使用,原來用這個標籤這麼神奇,就可以完成一些ajax的效果,以前看到的...