アリ筆記試験-20190412

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;
}

 

おすすめ

転載: blog.csdn.net/LXQ1071717521/article/details/89259513