hdu5954

Posted mxang

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了hdu5954相关的知识,希望对你有一定的参考价值。

我觉得这个博客属实牛逼
https://www.cnblogs.com/dilthey/p/9973558.html
通俗易懂,
连我这种高数60分的人都能看懂

其实h>=1很好考虑,,然后就要积分了。。。。。

另外!
acos他的值要特判一下!!!
我他妈前几天打比赛刚被这个傻逼东西卡自闭了。我好难啊。

#include <bits/stdc++.h>
using namespace std;
typedef long double db;
const db pi = acos(-1);
const db eps = 1e-10;
int sign(db k){
    if (k>eps) return 1; else if (k<-eps) return -1; return 0;
}
int cmp(db k1,db k2){return sign(k1-k2);}
db get(db alf){
    return pi*cos(alf)+sin(alf)-alf*cos(alf)-pow(sin(alf),3)/3.0;
}
db check(db x){
    db p = 2.0/tan(x)-1;
    if(p>1)p=1.0;
    if(p<-1)p=-1.0;
    return abs(tan(x)*(get(acos(p))-get(pi)));
}
int t;db h;
int main(){
    ios::sync_with_stdio(false);
    cout.flags(ios::fixed);
    cout.precision(5);
    cin>>t;
    while (t--){
        cin>>h;
        if(cmp(h,1)>=0){//
            db l = (2.0-h)*2;
            db a = sqrt(l*l+4);
            a/=2;
            db b = 1;
            db S = pi*a*b;
            cout<<S<<endl;
        }else if(cmp(h,0)>0){
            db l=pi/4,r=pi/2;
            while (l+0.000000001<r){
                db m = (l+r)/2;
                //db v_ = check(m);
                if(check(m)>pi*h){
                    l=m;
                }else{
                    r=m;
                }
            }
            db p = 2.0/tan(l)-1;
            if(p>1)p=1.0;
            if(p<-1)p=-1.0;
            db alf = acos(p);
            db ss = pi-alf+sin(alf*2)/2;
            cout<<ss/cos(l)<<endl;
        }else{
            cout<<0.0<<endl;
        }
    }
}

以上是关于hdu5954的主要内容,如果未能解决你的问题,请参考以下文章

hdu5954 Do not pour out

HDU 5954 Do not pour out(二分+积分)

HDU 5954 - Do not pour out - [积分+二分][2016ACM/ICPC亚洲区沈阳站 Problem G]

HDU4057 Rescue the Rabbit(AC自动机+状压DP)

HDU3247 Resource Archiver(AC自动机+BFS+DP)

POJ - 2778 ~ HDU - 2243 AC自动机+矩阵快速幂