题意:
有n道题,每道题有分值,A和B对战,B的答题是随机的,即1/2的几率答对。
问A至少要得到多少分,才会有至少p的概率不会输给B(得分不比B低)。
数据范围:n<=40,0<=p<=1
解法:
要想计算A在不低于p的概率获胜的最小分数,
就需要计算B在至少p概率下能获得的最小分数,
令d[i][j]表示B答前i道题,分数为j的概率,
假设总分数为tot,那么d[n][0]+d[n][1]+...d[n][tot]=1.
累加d[n][0],d[n][1]..直到>=p为止,此时d[n][j]的j就是答案.
code:
#include<bits/stdc++.h>
using namespace std;
const int maxm=4e4+5;
double d[45][maxm];
int a[maxm];
int n;
double p;
signed main(){
int T;cin>>T;
while(T--){
cin>>n>>p;
int tot=0;
for(int i=1;i<=n;i++){
cin>>a[i];
tot+=a[i];
}
memset(d,0,sizeof d);
d[0][0]=1;
for(int i=1;i<=n;i++){
for(int j=0;j<=tot;j++){
d[i][j]+=d[i-1][j]/2;//答错
if(j>=a[i]){
d[i][j]+=d[i-1][j-a[i]]/2;//答对
}
}
}
int ans=0;
double temp=0;
for(int i=0;i<=tot;i++){
temp+=d[n][i];
if(temp>=p){
ans=i;
break;
}
}
cout<<ans<<endl;
}
return 0;
}