题面意思,问围着一个x的跑道跑顺时针跑,打卡完毕的时候跑k米及以上的概率。
思路:
因为这个人跑步只能先打第一张卡,在打第二张卡,所以有可能第二张卡在第一张卡前面,那么这个人就得跑第二圈才能打第二张卡,否则是直接就可以在第一圈打掉第一张卡和第二张卡。而且,无论如何都是可以在两圈以内完成打卡的
根据这个规律,将情况分为三种:
(正难则反,求能够在k米之前能够完成打卡的概率,最后再减)
1.k≥2x,那么这个人将永远不可能跑到k米
2.k>=x&&k<x,那么要想跑k米,就一定会倒腾到第二圈,即第二张卡在第一张卡前面,直接减去第一张卡在第二张卡前面的概率0.5。第一张卡只需要放在第二张卡的后面,然后第二张卡放到前(k-x)米,概率也就是(k-x)/x,再减去这个概率
3.k<x,那么这种情况下就很简单了,只有把两张卡都放在前(k)米,才会跑在k米之前完成任务,所以用1.0减去k米前完成的概率
#include <bits/stdc++.h> using namespace std; int main() { int t; scanf("%d",&t); while(t--) { int k,x; scanf("%d%d",&k,&x); if(k>=2*x) printf("0.00\n"); else if(k>=x&&k<2*x) { double ans=0.5-(1.0*(k-x)/x)*(1.0*(3*x-k)/2/x); printf("%.2f\n",ans); } else if(k<x) { double ans=1.0-(1.0*k/x*k/x/2); printf("%.2f\n",ans); } } }