链接:https://ac.nowcoder.com/acm/contest/4138/H
来源:牛客网
时间限制:C/C++ 3秒,其他语言6秒
空间限制:C/C++ 262144K,其他语言524288K
64bit IO Format: %lld
题目描述
有 {1}1 到 {n}n 这些数字各一个。你用这些数字进行若干轮游戏。
对于每一轮,如果剩下的数字个数超过 {1}1 个,那么就等概率随机选择两个剩下的数字删去。如果这两个数字互质,得一分。
重复以上操作直到没数字可以删除为止。请问最后期望得多少分?
输入描述:
一行一个整数 {n}n (1 \leq n \leq 50001≤n≤5000)。
输出描述:
输出一个最简约数 \frac{a}{b}
b
a
表示答案。
示例1
输入
复制
2
输出
复制
1/1
示例2
输入
复制
4
输出
复制
5/3
题意很关键:第一天的时候a1,a2就可以各自加1了,然后第一天就是a1+1,a2+1;
接下来就是一样的步骤,不断更新a1,a2的值;。
注释的代码就是刚开始理解错了 想麻烦了
AC代码:
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int x,y;
int minn;
void get_ans(int v1,int v2,int a,int b,int ans)
{
//cout <<v1<<" "<<v2<<" "<<a<<" "<<b<<" "<<ans<<endl;
// if(ans>=minn) return ;
// if(v1>=x&&v2<y) return ;
// if(v1<x&&v2>=y) return ;
if(v1>=x&&v2>=y)
{
minn=min(minn,ans);
return ;
}
a++,b++;
get_ans(v1+a,v2+b,a,b,ans+1);
return;
}
int main()
{
int a,b;
cin >>a>>b;
int n;
cin >>n;
minn=99999999;
while(n--)
{
cin >>x>>y;
get_ans(0,0,a,b,0);
}
cout <<minn<<endl;
}


京公网安备 11010502036488号