2020牛客寒假算法基础集训营4 G 音乐鉴赏
https://ac.nowcoder.com/acm/problem/201638
假设它的平时成绩是a,期末成绩是b,期末成绩占比为x
它想要优秀,则a(1-x)+bx>90
得到b>[90-a(1-x)]/x,令lim=这个优下限
那么它优秀的概率(90-lim)/90
所有人优秀的概率的和除以总人数即得到该课程优秀率
二分这个x即可
题解更妙
因为平时成绩都>90,期末成绩都<=90
所以若比90多出来的平时成绩能补给比90低的期末成绩,他就可以优秀
即(a-90)(1-x)-bx>0
a是平时成绩 x是期末占比
注意b是比90低多少分
b<(a-90)(1-x)/x
所以优秀的概率是(a-90)(1-x)/90x
所有人的优秀概率总和=0.1n,即可把x解出来
#include<cstdio> using namespace std; #define N 100001 const double eps=1e-6; int n,a[101]; double check(double x) { double m=0,lim; for(int i=91;i<=100;++i) { lim=(90-i*(1-x))/x; m+=(90-lim)/90*a[i]; } return m/n; } int main() { scanf("%d",&n); int x; for(int i=1;i<=n;++i) { scanf("%d",&x); a[x]++; } double l=0,r=1,mid; while(r-l>eps) { mid=(l+r)/2; if(check(mid)>0.1) l=mid; else r=mid; } printf("%.2lf%%",l*100); return 0; }