题意:一款游戏有n个关卡,正常条件下第i个关卡耗时ai,游戏中存在一个加速器,如果在某个关卡获得这个加速器,那么在这之后的关卡中使用的时间为bi
在每个关卡获得加速器的概率是pi,如果你可以随便安排关卡的顺序,那么输出最少的通关的期望时间
考虑Ci=Ai-Bi,那么按照给定顺序的期望是B1+...Bn+P1(C1)+P2(C1+C2)+..+Pn(C1+..+Cn)
考虑交换i和i+1,那么对结果的影响是Pi+1*Ci-Pi*Ci+1 ,只有该式<=0的时候,交换才不亏,所以可以得到
Ci/Pi<=Ci+1/Pi+1交换才有价值,那么按照Ci/Pi进行排序就好了,不过要特别注意的是,Pi=0的时候要特殊处理,处理成INF就好了
1 #include<bits/stdc++.h> 2 using namespace std; 3 const int maxn=1e5+5; 4 5 int a[maxn],b[maxn],p[maxn],d[maxn]; 6 double c[maxn]; 7 8 bool cmp(int i,int j){ 9 if(p[i]==0)return false; 10 if(p[j]==0)return true; 11 return c[i]/p[i]<=c[j]/p[j]; 12 } 13 14 int main(){ 15 int t,n;cin>>t; 16 while(t--){ 17 cin>>n; 18 double res=0; 19 for(int i=0;i<n;i++) 20 cin>>a[i]>>b[i]>>p[i],c[i]=a[i]-b[i],res+=b[i], 21 d[i]=i; 22 23 sort(d,d+n,cmp); 24 double t=0; 25 for(int i=0;i<n;i++){ 26 int tt=d[i]; 27 t+=c[tt]; 28 res+=p[tt]*t/1e7; 29 } 30 31 printf("%.6f ",res); 32 33 } 34 return 0; 35 }