《中山大學內部選拔(一)》 遊戲
【問題描述】
A,B兩人各有不同分值的 M 張牌,他們進行N回合的遊戲,每個回合兩人分別在自己的M張牌裡抽取1張,然後記下各自的分數並把牌收回到自己的牌堆中,然後繼續下一回合。遊戲結束後,兩人的得分就是各自每回合的分值和,如果其中一個人的分數和較大,則這個人就贏得比賽。
現在告訴你A,B兩人各自M張牌的分值以及遊戲的回數,請你計算A贏得比賽的概率。
【輸入格式】
首先是T,表示資料組數。
每組資料包含4行:第1行為M,第2行為A的M張牌的分值,第3行是B的M張牌的分數。第4行為N。
【輸出格式】
輸出一個保留6位小數的實數,表示A贏得比賽的概率。
【輸入樣例】
1
10
5 9 6 12 13 15 52 11 11 11
8 9 6 3 2 1 85 9 2 3
15
【輸出樣例】
0.620092
【資料範圍】
1<=M<=100 0<=N<=50 每張牌的分值不超過50。
【來源】
《中山大學內部選拔(一)》
這道題我拿到的題資料範圍有誤害的我好一陣亂優化,結果其實直接就能過。
很明顯這是一道數學期望,我們可以直接用遞推得到2個人分別得到每個分數的概率,這時我們要用一個字首和的思想,把乙的分數的字首和算出來,用g(i)表示乙得到小於等於i的分數的概率。然後沒舉每個i用甲得到分數i的概率乘上g(i-1),全部加起來就是答案了。
詳細程式碼如下:(有點醜,畢竟亂優化了一波)
#include<cstdlib>
#include<cstring>
#include<cstdio>
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
typedef long long ll;
const int maxn=1000005;
double d[maxn],q[maxn],g[maxn],p,a1[maxn],b1[maxn];
int a[maxn],b[maxn],cnt1,cnt2;
int m,n;
int main()
{
freopen("Game.in","r",stdin);
freopen("Game.out","w",stdout);
int T;
scanf("%d",&T);
while(T--)
{
cnt1=cnt2=1;
scanf("%d",&m);
for(int i=1;i<=m;i++) scanf("%d",&a[i]);
sort(a+1,a+1+m);
for(int i=1;i<=m;i++) scanf("%d",&b[i]);
sort(b+1,b+1+m);
p=1.0/(double)m;
scanf("%d",&n);
memset(d,0,sizeof(d));
memset(a1,0,sizeof(a1));
memset(b1,0,sizeof(b1));
for(int i=2;i<=m;i++)
{
if(a[i]!=a[i-1]) a[++cnt1]=a[i];
else a1[cnt1]+=p;
}
for(int i=1;i<=cnt1;i++) a1[i]+=p,d[a[i]]=a1[i];
for(int i=2;i<=n;i++)
for(int j=a[cnt1]*i;j>=a[1]*(i-1);j--)//算甲前i次得到j分的概率
{
double ans=0;
for(int k=1;k<=cnt1;k++)
{
if(j-a[k]<a[1]*(i-1)) break;
ans+=d[j-a[k]]*a1[k];
}
d[j]=ans;
}
memset(q,0,sizeof(q));
for(int i=2;i<=m;i++)
{
if(b[i]!=b[i-1]) b[++cnt2]=b[i];
else b1[cnt2]+=p;
}
for(int i=1;i<=cnt2;i++) b1[i]+=p,q[b[i]]=b1[i];
for(int i=2;i<=n;i++)
for(int j=b[cnt2]*i;j>=b[1]*(i-1);j--)算乙前i次得到j分的概率
{
double ans=0;
for(int k=1;k<=cnt2;k++)
{
if(j-b[k]<b[1]*(i-1)) break;
ans+=q[j-b[k]]*b1[k];
}
q[j]=ans;
}
memset(g,0,sizeof(g));
int ans2=0;
int t=max(b[cnt2],a[cnt1])*n;
for(int i=b[1]*n;i<=t;i++)//算字首和g,主要範圍
g[i]=g[i-1]+q[i];
double ans=0;
for(int i=a[1]*n;i<=t;i++)//求答案
ans+=g[i-1]*d[i];
printf("%.6lf\n",ans);
}
return 0;
}
相關文章
- 2024天梯選拔賽(一)
- 中山大學:調查發現低年級大學生更願意選擇網路信貸
- Android 遊戲開發入門——大學霸內部資料Android遊戲開發
- Swift遊戲開發實戰教程(大學霸內部資料)Swift遊戲開發
- OUYA遊戲開發核心技術剖析大學霸內部資料遊戲開發
- 中山大學人工智慧夏令營實踐課人工智慧
- 中山大學新炬網路學院首開大資料技術選修課大資料
- 泰山學堂選拔遊記
- Django Meta內部類選項Django
- NGUI全面實踐教程(大學霸內部資料)NGUI
- bzoj2438: [中山市選2011]殺人遊戲(強聯通)遊戲
- 專案經理的選拔(轉)
- 百度靈醫攜手中山大學中山眼科中心,舉辦PALM比賽加速眼科AI化AI
- Linux安全滲透教程——大學霸內部資料Linux
- Arduino Yun快速入門教程(大學霸內部資料)UI
- ?HealthKit開發快速入門教程大學霸內部教程
- 關於選拔國內本科生於2021年秋季赴阿伯泰學習遊戲碩士的通知遊戲
- Redo內部解析(一)
- NGUI從入門到實戰(大學霸內部資料)NGUI
- 2020ICPC·小米 網路選拔賽第一場
- JVM 內部原理(一)— 概述JVM
- 中山大學自主招生面試題:假如廣州停電5分鐘面試題
- Arduino可穿戴開發入門教程(大學霸內部資料)UI
- Wireshark網路分析例項集錦(大學霸內部資料)
- 2023年中國高校計算機大賽-團隊程式設計天梯賽(GPLT)上海理工大學校內選拔賽 (vp + 補題)計算機程式設計
- java內部類,區域性內部類,靜態內部類,匿名內部類Java
- 中美科技戰:中國選拔12所頂尖大學在科學技術研究方面與MIT、史丹佛抗衡MIT
- 中山遊記
- Xamarin Android開發實戰(上冊)大學霸內部資料Android
- BeagleBone Black專案實訓手冊(大學霸內部資料)
- 關於選拔國內本科生申請阿伯泰遊戲開發碩士2022年春季班的通知遊戲開發
- java之內部類(InnerClass)----非靜態內部類、靜態內部類、區域性內部類、匿名內部類Java
- M-災難預警-浙江農林大學第十九屆程式設計競賽暨天梯賽選拔賽程式設計
- 10-Java內部類——成員內部類、區域性內部類、匿名內部類Java
- 羅切斯特大學&日內瓦大學:研究顯示玩遊戲有助改善視力遊戲
- java內部類之成員內部類之匿名內部類Java
- NYNU ACM 藍橋杯選拔賽 解題報告ACM
- 專案經理之專案經理的選拔