列表

详情


NC233106. 恶意竞争

描述

巨软和微硬两家公司是竞争对手,微硬希望从巨软公司的软件中找到漏洞来打击竞品的销量。巨软公司的软件有s个子组件,漏洞分为n类,微硬公司希望在其中每个子组件中都找到至少一个漏洞,且找到每个类型至少一个漏洞。微硬公司每天可以找到一个漏洞(从每个子组件中找出漏洞的概率相同,漏洞属于任一分类的概率相同。假设漏洞足够多,找出任意漏洞不影响前述条件),请你帮他们求出完成目标的期望天数。

输入描述

输入包含一行两个整数n,s ()。

输出描述

输出一行一个实数表示答案。绝对误差或相对误差不超过时即为正确。

示例1

输入:

1 2

输出:

3.0000

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++(g++ 7.5.0) 解法, 执行用时: 27ms, 内存消耗: 7876K, 提交时间: 2022-11-01 16:39:00

#include<bits/stdc++.h>
using namespace std;
#define int long long
int n,m;
double f[1010][1010];
signed main()
{
    cin>>n>>m;
    for(int i=n;i>=0;i--)
        for(int j=m;j>=0;j--){
           if(i==n&&j==m) continue;
            f[i][j]=(1.0*f[i+1][j]*(n-i)*j/n/m+1+1.0*f[i][j+1]*(m-j)*i/n/m+
                     1.0*f[i+1][j+1]*(n-i)*(m-j)/n/m)/(1-(1.0*i*j/n/m));
        }
    printf("%lf",f[0][0]);
}

C++(clang++ 11.0.1) 解法, 执行用时: 23ms, 内存消耗: 11644K, 提交时间: 2022-10-04 20:17:08

#include<bits/stdc++.h>
using namespace std;
double f[12345][12345];
int n,s;
int main(){
	cin>>n>>s;
	f[n][s]=0;
	for(int i=n;i>=0;i--)for(int j=s;j>=0;j--)if(i!=n||j!=s)f[i][j]=s*n*1.0/(s*n-i*j)*(i*j*1.0/s/n+(n-i)*j*1.0/s/n*(f[i+1][j]+1)+i*(s-j)*1.0/n/s*(f[i][j+1]+1)+(n-i)*(s-j)*1.0/s/n*(f[i+1][j+1]+1));
	printf("%.4lf",f[0][0]);
} 

上一题