牛客暑期多校訓練營2019第十場

2021-10-07 15:00:23 字數 3095 閱讀 1834

傳送門

題意:n張紙牌,每張紙牌上寫有乙個數字。給定乙個下限a,乙個上限b。alice每一輪從牌堆中不放回地抽出一張牌,如果抽出的牌的總和大於a且不大於b,alice那麼獲勝。如果抽出的所有牌的總和大於b,遊戲立即結束;總和小於等於b,alice可以選擇遊戲繼續,也可以選擇結束。求獲勝的概率。

思路

alice的最優策略為,抽到牌總和在 (a,b] 之間時,立刻結束遊戲。

注意到,只有最後一張牌需要確定,前面的牌順序不重要。

所以,我們可以列舉最後一張牌x,dp[j][k]表示除了x以外在其他牌中選j張,總和為k的概率。對答案的貢獻為dp[j][k]/(n-j),當a≤

\le≤b時,即max

⁡\max

max(0,a-x+1)≤

\le≤k≤

\le≤min

⁡\min

min(a,b-x)時。

那麼如何求dp[j][k]呢?運用可逆揹包的思想,先求出對於所有牌中選取j張總和為k的情況,再刪除x的影響。

求所有牌的情況:f[i][j][k]表示考慮前i張牌,選了j張,總和為k的概率,f[i][j][k]=f[i-1][j][k]+f[i-1][j-1][k-v[i]]/(n-j+1)*j。f[n][i][j][k]即為考慮所有牌的概率。

const

int n=

510;

double f[2]

[n][n]

,dp[n]

[n];

int v[n]

;int

main()

for(

int i=

1;i<=n;i++

)int l=

max(a-v[i]+1

,0);

int r=

min(b-v[i]

,a);

for(

int j=

0;j)for

(int k=l;k<=r;k++

) ans+

=dp[j]

[k]/

(n-j);}

printf

("%.12lf"

,ans)

;return0;

}

題意:初始串為空,n次操作,每次在串首/尾加乙個音符。乙個串可以按照如下方式劃分迴圈節:對於迴圈節長度len,如果對於任意i(1≤

\le≤i≤

\le≤n-len),滿足s[i]==s[i+len],那麼以len為迴圈節長度劃分迴圈節是乙個可行的劃分方式。求每一次操作後,串有幾種劃分迴圈節的方式。

思路

注意到,對於迴圈節長度x而言,能夠按照x劃分的串在t=x之後的乙個連續區間內,一旦某次不能按照x劃分,後續的迴圈節都會大於x。

因此,對於每乙個x,可以二分求得它貢獻答案的區間的右端點。

那麼如何判斷s[1……n]可以按照x劃分呢?只需s[1……n-x]與s[x+1……n]相等即可,可以用hash來驗證。

const

int n=

1e6+10;

const

long

long md=

1e9+7;

const

long

long base=37;

struct str

str(

int a,

int b)

}pre[n]

,s[n]

;long

long hah[n]

,f[n]

;int vist[n]

,a[n]

;map int>mp;

intjudge

(int len,

int x)

void

init

(int n)

intmain()

int cnt=0;

for(

int i=precnt;i>

0;i--

) vist[0]

=cnt+1;

for(

int i=1)

for(

int i=

1;i<=n;i++

) hah[i]

=(hah[i-1]

*base%md+s[i]

.x)%md;

for(

int i=

1;i<=n;i++

) a[i]

++; a[r]--;

}int ans=0;

for(

int i=

1;i<=n;i++

)return0;

}

題意:給n個點,用一條線將其劃分成兩部分。要求線上無點,且兩部分點的個數相等。求距離直線最近的點與直線距離的最大值。

思路

注意到,所求直線必然與其中某兩點連線平行或垂直。所以,我們可以列舉斜率,按照斜率將點排序,取中間的兩個點,計算答案。

const

int n=

305;

double p[n]

,x[n]

,y[n]

;int n;

double

cal(

double k)

intmain()

sort

(x+1

,x+n+1)

;sort

(y+1

,y+n+1)

; ans=

max(ans,

(x[n/2+

1]-x[n/2]

)/2.0)

; ans=

max(ans,

(y[n/2+

1]-y[n/2]

)/2.0)

;printf

("%.12lf"

,ans)

;return0;

}

2019牛客暑期多校訓練營(第十場)

rank solvedab cdef ghij 347 714 3 10 o o o.o 當場通過 賽後通過 尚未通過 upsolved by viscaria chelly viscaria s solution 列舉最後是拿哪一張牌贏的,dp一下求出概率,可逆揹包可以加速求出這個狀態 solve...

牛客暑期多校訓練營B Boundary

給定n個點,然後確定乙個過原點的圓,要使這n個點盡可能多的存在與圓上,最後輸出最多的存在於圓上的點的個數 三點確定乙個圓,我們已知這個圓必定經過原點,所以再依次利用三點求圓心的公式列舉每兩個點與原點 三點不共線 確定的圓心,最後選擇確定次數最多的圓心構成的圓 include include incl...

2019牛客暑期多校訓練營(第九場)

d knapsack cryptosystem 折半搜尋,晚上又去看了挑戰程式設計,對於時間複雜度高的情況,可以通過犧牲空間來降低時間複雜度。先把前半部分所有可以組合的情況列舉出來,然後對於後半部分依次列舉,那麼複雜度變化為o 2 36 o 2 18 2 18log 18 顯然就可做了,折半的裸題。...