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...