【浮点数运算】
【浮点数运算】
一般都是简单的模拟题 想对正确的做法 一定不要傻傻按题意直接double/long double!
核心:减少运算次数/找规律用整数算/若小数位数固定就先乘1ex
一定要避免多次浮点数运算!!!->精度有差
H Travel Begins
https://codeforces.com/gym/104354/submit
/*
涉及浮点数运算的题目:尽量不要算太多次 会有精度问题
->找结论 0.5是一个重要的数
(1)若k>2*n -> n/k<1/2 -> 最小为0 最大为2*n(每个数分0.5)
(2)若k<2*n:一定能算到最后一个数有剩下的值
最小肯定是尽可能填多的0.49999
最大肯定是尽可能填多的0.5
->
【最小】
前k-1个数为(0.5-eps)判断第k个数是否进位
对于第k个数res=n-(k-1)*(0.5-eps)
=n-0.5*(k-1)+eps=n-0.5*k+0.5+eps->(进位)n-k/2+1
【最大】
前k-1个数为0.5
res=k-1+n-(k-1)*0.5
=n+0.5*(k-1)->遇0.5进位->=n+0.5*k
*/
ll n,k;
void solve(){
cin>>n>>k;
if(k>2LL*n){
cout<<0<<" "<<2*n<<endl;
}
else{
ll minn=n-(k-1LL)/2LL,maxx=n+k/2LL;
cout<<minn<<" "<<maxx<<endl;
}
}
随机反馈
【期望计算】 考虑每个点带来的贡献
【卡double读入】:是整数读入时 先读整数再转换为小数
https://acm.hdu.edu.cn/contest/problem?cid=1176&pid=1010
思路
注意从后往前DP:最后一个状态是确定的
代码
const int N=1e5+10;
int n;
double x[N];
void solve(){
read(n);
//vector<double> x(n+1,0);
for(int i=1;i<=n;i++){
int tmp;
read(tmp);
x[i]=(double)tmp;
}
double ans=(double)n;
for(int i=n-1;i>=1;i--){
double p=x[i]/1000.0;
if((p*(20.0+ans)+(1-p)*i)<ans) ans=(p*(20.0+ans)+(1-p)*i);
}
printf("%.10lf\n",ans);
}