傳送門
題意: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 顯然就可做了,折半的裸題。...