链接: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; }