这题好生厉害!
如果n再小一点的话,这题是个贪心。我们把烧到过100度的水能进行热传导就进行热传导,一直向后进行。
这种做法是O(n^2)的,显然过不了。 然后注意到,这题肯定有规律嘛!推导:设沸腾温度为a
则第一杯温度为a,需要加热t1=a 第二杯可以中和的最高温度为a/2,需要加热t2=a/2 第三杯可以中和的最高温度为t3=(a/4+a)/2=5a/8,需要加热t3=3a/8 第四杯可以中和的最高温度为t4=((a/8+5a/8)/2+a)/2=11a/16,需要加热t4=5/16 则t3/t2=3/4=1-1/4, t4/t3=5/6=1-1/6 继续推导得t(n+1)/t(n)=1-1/2n (其实好难)#include#include #include #include #define P 4200using namespace std;int n;double t[50001],ans;int main(){ scanf("%d",&n); double V=1.0/n; /*for(int i=1;i<=n;i++) { ans+=(100.0-t[i])*V*P; printf("-----%lf\n",(100.0-t[i])/100.0); t[i]=100.0; for(int j=i+1;j<=n;j++) { double d=(t[i]-t[j])/2; t[i]-=d,t[j]+=d; } } printf("%.2lf\n",ans);ans=0;*///以上为贪心 double T=1.0; for(int i=1;i<=n;i++) { ans+=T; T=T*(1.0-1.0/(2*i)); } ans*=V*P*100; printf("%.2lf",ans); return 0; }