题解:P10781 【MX-J1-T1】『FLA - III』Spectral
P10781【MX-J1-T1】『FLA - III』Spectral 题解
(非正解,正解应该是数学题。)
这道题很简单,分析题意就可以得出核心代码:
for(int i=1;i<=n;i++){
ans=k+ans/i;
}
那么恭喜你获得 \(40\) pts。
为什么呢?因为题目需要的是最高温度,而烧碳获得的温度可能小于烧炭时减低的温度。
简单说就是有可能你越烧温度越低,反而第一次烧出的温度是最高的。
所以在对ans进行操作时应判断烧了温度更高还是不烧温度更高,并保留更高的温度。
代码:
for(int i=1;i<=n;i++){
ans=max(k+ans/i,ans);
}
这样可以获得 \(80\) pts。
因为最后一个点是TLE所以我们应对循环进行优化。
很容易得出如果烧碳增加的温度小于烧炭时降低的温度那么第一次的温度便是最高温度,所以后续就不用继续循环了。
AC代码:
for(int i=1;i<=n;i++){
ans=max(k+ans/i,ans);
if(ans>=k+ans/i){
break;
}
}
最后附上完整代码
#include<iostream>
#include<cmath>
using namespace std;
int main(){
cin.tie(0),cout.tie(0);
int t;
cin>>t;
while(t--){
int n,k;
cin>>n>>k;
float ans=0;//警钟敲烂,必须用double,float 40pts
for(int i=1;i<=n;i++){
ans=max(k+ans/i,ans);
if(ans>=k+ans/i){
break;
}
}
printf("%.1f\n",ans);
}
return 0;
}
这是本巨弱的第一篇公开题解,审核大大求通过,审核大大辛苦了!!