2015ACM多校對抗賽第五場

2021-08-21 22:16:21 字數 1718 閱讀 3470

1004——mzl's game

當時全場沒有隊伍通過的一道題,此題狀態構造的甚是巧妙

題意:n個人,每次從存活的人中等概率選出乙個人去攻擊場上其他人,被攻擊者存活的概率相等 且由題目給出,選出的人出局。求乙個人被攻擊k次之後出局(被選出來攻擊其他人後出局,受到攻擊死亡不算出局)的概率。

思路:出題人的想法是先把這個問題轉化為 從1,2...n順次選取參與者去攻擊其他人,如果被選者死亡,則直接選取下乙個人即可。我們先處理出1,2...n的人受到 j 次攻擊後存活的概率,dp[i][j]表示選取第 i 個人時,i 到 n的人都受到了 j 次攻擊的概率,可以得到dp[i][j] = dp[i-1][j-1]*p1(第i-1個人受到j-1次攻擊後存活的概率)+dp[i-1][j]*p2(第i-1個人在 j 次攻擊內死亡的概率)。因為如果第 i-1 個人存活,那麼必然會對i,i+1...n的人都進行一次攻擊;只有當第i-1個人在之前的攻擊中死亡,其餘人才不會受到攻擊。

乙個人被攻擊k次之後出局的概率其實就是dp[1,2...n][k]的和乘以p3(乙個人受到k次攻擊不死亡的概率)再除以n取平均數。在這裡可以將dp[i][j]看作是第i個人受到j次攻擊的概率。

#include#include#includeusing namespace std;

#define ll long long

#define mod 258280327

ll power(ll x,ll k)

return res;

}ll dp[2100][2100];

int main()edge[6*n];

int k,head[n],num[n],in[n],out[n],n,ans[n*3];

bool vis[n*6];

void add_edge(int from,int to)

void dfs1(int u)

v=edge[i].to;

if(u!=v&&in[v]>out[v])

continue;

out[u]++;

in[v]++;

vis[i]=vis[i^1]=true;

ans[i/2]=i%2?0:1;

head[u]=edge[i].next;

dfs1(v);

break;

}}void dfs2(int u)

v=edge[i].to;

if(u!=v&&in[v]=out[i])

dfs1(i);

else

dfs2(i);

for(i=0;i1006——mzl's ****** problem

1 x : add number x to set

2 : delete the minimum number (if the set is empty now,then ignore it)

3 : query the maximum number (if the set is empty now,the answer is 0)

就是在set裡進行簡單操作。注意是to set,說的很明白了

**:#includeusing namespace std;

set::iterator it;

sets;

int main()

else if(a == 2)

else if(a == 3)}}

return 0;

}

本文參考:

湖南多校對抗賽 A A

題意 有一些長方形,面積為1 x或者2 x,現在要算出能把這些 長方形全部包含起來的長方形的大小 2 m 簡單來說就是 給你乙個寬為2的長方形,求出長最小為多少時能把全部長方形 包含起來。解法 因為大的長方形寬始終為2,而其他長方形寬為1 2。即當寬為2的 長方形直接放入 即長度直接加上對於得長度 ...

湖南多校對抗賽 D D

include 題意 有3個只包含大寫字母的字串a,b,c。問能不能從 從a,b中分別拿出n 2個字元組成c串。n為a的長度 解法 直接統計26個大寫字母在a,b,c串中出現的個數,當c串中出現字母時,則看a,b串中這個字母出現的 次數之和 a,b這個字母最多為n 2 是否大於c對應 的個數,否則不...

湖南多校對抗賽(csu 1560)

簡單的bfs搜尋題,對每個初始的水滴依次擴充套件,當達到規定步數時跳出。這題還是有坑點的,對於每個初始的水滴,已經訪問過的位置不再訪問,但是對於不同的水滴,別的水滴已經訪問過的,對於當前水滴來說可能還要訪問,才能使擴充套件的範圍最大。include include include include i...