题目链接
题目描述
Takahashi is now competing in a programming contest, but he received TLE in a problem where the answer is YES or NO.
When he checked the detailed status of the submission, there were N test cases in the problem, and the code received TLE in M of those cases.
Then, he rewrote the code to correctly solve each of those M cases with 1⁄2 probability in 1900 milliseconds, and correctly solve each of the other N−M cases without fail in 100 milliseconds.
Now, he goes through the following process:
Submit the code.
Wait until the code finishes execution on all the cases.
If the code fails to correctly solve some of the M cases, submit it again.
Repeat until the code correctly solve all the cases in one submission.
Let the expected value of the total execution time of the code be X milliseconds. Print X (as an integer).
Constraints
All input values are integers.
1≤N≤100
1≤M≤min(N,5)
输入
Input is given from Standard Input in the following format:
N M
输出
Print X, the expected value of the total execution time of the code, as an integer. It can be proved that, under the constraints in this problem, X is an integer not exceeding 109.
样例输入
1 1
样例输出
3800
提示
In this input, there is only one case. Takahashi will repeatedly submit the code that correctly solves this case with 1⁄2 probability in 1900 milliseconds.
The code will succeed in one attempt with 1⁄2 probability, in two attempts with 1⁄4 probability, and in three attempts with 1⁄8 probability, and so on.
Thus, the answer is 1900×1⁄2+(2×1900)×1⁄4+(3×1900)×1⁄8+…=3800.
题解:
这个题目设置为英文,很坑,当我理解的时候,是看了题解的时候。
我表达一下这个场景吧,主人公在做题目,有几题不太确定;
总共n个示例在判题机里面,然后有m个题主人公想卡时间卡过去。没什么把握。
但是主人公有1/2的把握能卡过去。但是(n-m)组示例他有百分百的把握能过。
然后,主人公疯狂提交,然后让你求 ( 100*(n-m) + m *1900 ) ×期望
期望怎么求:百度百科
我们把上交的次数设为权值,然后进行随机实验。
设p=1/(2^m)指的是全部通过m组示例,然后只要有一组不通过都不能做对就是1-p,把它设为q=1-p;
这个问题就是 把 全对设为: q ,对立事件就是:p=1-q
期望:E(X)=1*p+2*q*p+3*q*q*p+4*q*q*q*p+……n*q^(n-1)*p;
式子手写的。
然后进行推公式:
然后这个式子:
Ans=( ( n - m ) *100 + (m)*1900 )*(2^m)
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll qpow(ll a,ll b){
ll ans=1;
while(b){
if(b&1){
ans=a*ans;
}
a=a*a;
b>>=1;
}
return ans;
}
int main()
{
ll n,m;
scanf("%lld%lld",&n,&m);
ll ans=qpow(2,m);
ans=(( (n-m) * 100 )+ m * 1900 )*qpow(2,m);
printf("%lld\n",ans);
return 0;
}