1.1。
わからない方もいらっしゃるかもしれませんが、ここでは皆さんに説明します。
質問に付属するテストサンプルは非常に単純です。
1
0.999999
この入力サンプルに対応する出力は1.0000です。
つまり、最初のラウンドでは、Xiao Mingは0.999999の確率でボーナスを獲得し、残りの0.000001の確率は次のラウンドの確率です(Xiaohuaがボーナスを獲得する確率ではありません)。
したがって、第2ラウンドでは、シャオミンがボーナスを獲得する確率は、第1ラウンドでボーナスを獲得する確率です。これは、第2ラウンドは、シャオフアがボーナスを獲得したかどうかに関するものであり、シャオミンとは関係がないためです。したがって、第2ラウンドの後、シャオミンがボーナスを獲得する確率の合計は0.999999、シャオフアがボーナスを獲得する確率は0.000001 * 0.999999、次のラウンドに進む確率は0.000001 * 0.000001です。
類推すると、Xiao Mingのボーナス獲得の最小確率はすでに0.999999であるため、彼は1.0000に切り上げました。
もう少し複雑な入力例を見てみましょう。
2
0.9 0.9
最初のラウンド:(以下はボーナスを獲得する合計確率を示しています)
Xiao Mingのボーナス獲得確率:0.9 Xiaohuaのボーナス獲得確率:0.0配布なしの確率:0.1
第2ラウンド:
Xiao Mingのボーナス獲得確率:0.9 Xiaohuaのボーナス獲得確率:0.1 * 0.9配布なしの確率:0.1 * 0.1
第3ラウンド:
Xiaomingがボーナスを獲得する確率:0.9 + 0.01 * 0.9 Xiaohuaがボーナスを獲得する確率:0.1 * 0.9配布がない確率:0.1 * 0.1 * 0.1
第4ラウンド:
Xiao Mingのボーナス獲得確率:0.909 Xiao Huaのボーナス獲得確率:0.1 * 0.9 + 0.001 * 0.9配布なしの確率:0.1 * 0.1 * 0.1 * 0.1
このように、以下同様に、100ラウンドまで。
上記の3つの確率の合計は常に1に等しくなります。
コードは次のように表示されます。
#include<cstdio>
#include<cstdlib>
#include<iostream>
#include<algorithm>
#include<cmath>
#include<vector>
using namespace std;
double p[10005];
int main(){
int n;
scanf("%d",&n);
for(int i=0;i<n;i++){
scanf("%lf",&p[i]);
}
double x1=0.0,x2=0.0,ji=1.0;
for(int i=0;i<100;i++){
if(i%2==0){
x1=x1+ji*p[i%n];
}
else{
x2=x2+ji*p[i%n];
}
ji=ji*(1-p[i%n]);
}
printf("%.4lf\n",x1);
return 0;
}
2.2。
いくつかの逸脱から始めましょう、
空のボックスを許可して、n個のボールをm個のボックスに入れることを検討してください。
dp [n] [m] = dp [n] [m-1] + dp [nm] [m]、n> = m
dp [n] [m] = dp [n] [m-1]、n < m
边界dp [n] [1] = 1、dp [1] [m] = 1、dp [0] [m] = 1
次に、n個のボールをm個のボックスに入れ、空のボックスは許可されません。
若n <m、dp [n] [m] = 0
m = 1の場合、dp [n] [1] = 1
若n = m、dp [n] [m] = 1
递推:dp [n] [m] = dp [n-1] [m-1] + dp [nm] [m]
dp [n] [m]は2つの部分に分解できます。最初の部分はn番目のボックスに1つのボールだけを入れ、残りのn-1個のボールをm-1のボックスに入れます。2番目の部分はそれぞれを入れることです。最初にボールをボックスに入れ、残りのnmボールをm個のボックスに分割します。空のボックスは使用できません。
このように、最初の部分は少なくとも1つのボックスに1つのボールが含まれ、2番目の部分は各ボックスに少なくとも2つのボールが含まれ、2つの部分が重ならないことです。この問題の解決策を得ることができます。
このトピックのシナリオに戻ります。
まず、dp [50] [50]のテーブルを作成し、上記の方法に従ってdpの値を計算します。
ballAllocate(int m、int n、int k)は次のように分解できます
m個のフィッシュボールを1つのボウルに入れ、+ n個のミートボールを1〜k-1個のボウルに入れます。
m個のフィッシュボールを2つのボウルに入れ、+ n個のミートボールを1〜k-2個のボウルに入れます。
………………
これらの状況の合計
#include <iostream>
#include <vector>
#include <numeric>
#include <limits>
using namespace std;
/** 请完成下面这个函数,实现题目要求的功能 **/
/** 当然,你也可以不按照这个模板来作答,完全按照自己的想法来 ^-^ **/
int ballAllocate(int m, int n, int k) {
if(k==1)
return 0;
if(k==2)
return 1;
int res=0;
for(int i=1;i<=k-1;i++){
for(int j=1;j<=k-i;j++){
}
res=res;
}
return m*n%10000;
}
int main() {
int res;
int _m;
cin >> _m;
cin.ignore (std::numeric_limits<std::streamsize>::max(), '\n');
int _n;
cin >> _n;
cin.ignore (std::numeric_limits<std::streamsize>::max(), '\n');
int _k;
cin >> _k;
cin.ignore (std::numeric_limits<std::streamsize>::max(), '\n');
res = ballAllocate(_m, _n, _k);
cout << res << endl;
return 0;
}