http://hihocoder.com/problemset/problem/1489
题意理解:每次获得一个物品之后都会清空初始概率为P/(pow(2, have)), 实际上获得N个东西的过程分别是独立的,并且N》=8之后的初始概率都是0,所以只需要分别算《=7和8的期望次数,这个用高中的期望定义暴力算就好了
急转弯:N》=8的其实和8一样
算法:无
数据结构:无
#include <iostream>
#include <cstdio>
#include <cmath>
using namespace std;
int P, Q, N;
double calcu(int start, int add){
double res = 0;
double pre = 1.0;
int now = start;
for(int i = 0; ; i++) {
if(now >= 100) {
res += pre * 1.0;
break;
}
res += pre * 1.0;
pre = pre * (1 - now / 100.0);
now += add;
}
return res;
}
int main(){
scanf("%d%d%d", &P, &Q, &N);
double ans = 0;
if(N >= 8) {
ans = (N - 7) * calcu(0, Q);
N = 7;
}
for(int i = 1; i <= N; i++){
int have = i - 1;
ans += calcu(P / (int)(pow(2, have) + 0.1), Q);
}
printf("%.2f\n", ans);
return 0;
}
from __future__ import print_function
#
#
'get familiar with python'
__author__ = 'hjkruclion'
import sys
import numpy as np
def read_int():
return list(map(int, sys.stdin.readline().split()))
P, Q, N = read_int()
def calcu(start, add):
res = 0
now = start
pre = 1.0
for i in range(10000):
if now >= 100:
res += pre * 1.0
break
res += pre
pre = pre * (1 - now / 100.0)
now += Q
return res
ans = 0
if N >= 8:
ans += calcu(0, Q) * (N - 7)
N = 7
for i in range(1, N + 1):
have = i - 1
ans += calcu(int(P // int(pow(2, have) + 0.1)), Q)
print('%.2f'%(ans))