【浮点数运算】

【浮点数运算】

一般都是简单的模拟题 想对正确的做法 一定不要傻傻按题意直接double/long double!
核心:减少运算次数/找规律用整数算/若小数位数固定就先乘1ex
一定要避免多次浮点数运算!!!->精度有差

H Travel Begins

https://codeforces.com/gym/104354/submit
image

/*
涉及浮点数运算的题目:尽量不要算太多次 会有精度问题
->找结论 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:最后一个状态是确定的
53dd987c-c073-43d3-8eb1-4c731f1b63c0

代码

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);
}
posted @ 2025-05-31 21:10  White_ink  阅读(13)  评论(0)    收藏  举报