• HDU-ACM“菜鸟先飞”冬训系列赛——第10场


    Problem A

    题意
    给出l(房子宽度),d(pole距离房子的垂直距离),s(绳子长度),求可覆盖的面积
    sample
    分析
    一共四种情况

    [1.s<=d ]

    [2.s<=sqrt(d*d+l*l/2) ]

    [3.s<=sqrt(d*d+l*l/2)+l/2 ]

    [4.s>sqrt(d*d+l*l/2)+l/2 ]

    说一下第四种,第四种要减去一个重叠部分,重叠部分面积为2个(扇形-三角形),具体见代码
    代码

    #include <cstdio>
    #include <cstring>
    #include <iostream>
    #include <algorithm>
    #include <string>
    #include <map>
    #include <queue>
    using namespace std;
    
    #define ll long long
    #define F(i,a,b) for(int i=a;i<=b;++i)
    #define R(i,a,b) for(int i=a;i<b;++i)
    #define mem(a,b) memset(a,b,sizeof(a))
    #pragma comment(linker, "/STACK:102400000,102400000")
    inline void read(int &x){x=0; char ch=getchar();while(ch<'0') ch=getchar();while(ch>='0'){x=x*10+ch-48; ch=getchar();}}
    const double eps=1e-8;
    const double pi=acos(-1.0);
    int t;
    double l,d,s;
    void solve()
    {
        if(s-d<eps)//1
        {
            printf("%.2f
    ",pi*s*s);return ;
        }
        double ret=sqrt(0.25*l*l+d*d),angle=acos(d/s);
        if(s-ret<eps)//2
        {
    
            printf("%.2f
    ",(pi-angle)*s*s+d*sqrt(s*s-d*d));
            return ;
        }
        angle=asin(0.5*l/ret);
        double ans=(pi-angle)*s*s+0.5*l*d;
        s-=ret,angle+=pi*0.5;
        ans+=angle*s*s;
        if(s-0.5*l>eps)
        {
            double angle1=acos(0.5*l/s);
            ans-=angle1*s*s-l*0.5*sqrt(s*s-l*l*0.25);
        }
        printf("%.2f
    ",ans);
    }
    int main()
    {
        for(scanf("%d",&t);t--;)
        {
            scanf("%lf %lf %lf",&l,&d,&s);
            solve();
        }
        return 0;
    }
    
    

    Problem B

    题意
    给出n个Merlin需要发短信的朋友,再给出m个Merlin不需要发短信的朋友,问Merlin需要发多少短信
    分析
    用map记录不需要发短信朋友,再扫一遍就OK了

    Problem E

    题意
    帮助Max挑出可能符合条件的酒店
    分析
    看了blog,递归是个好东西,脑洞开了一点
    代码

    #include <cstdio>
    #include <cstring>
    #include <iostream>
    #include <algorithm>
    #include <string>
    #include <map>
    #include <queue>
    using namespace std;
    
    #define ll long long
    #define F(i,a,b) for(int i=a;i<=b;++i)
    #define R(i,a,b) for(int i=a;i<b;++i)
    #define mem(a,b) memset(a,b,sizeof(a))
    #pragma comment(linker, "/STACK:102400000,102400000")
    inline void read(int &x){x=0; char ch=getchar();while(ch<'0') ch=getchar();while(ch>='0'){x=x*10+ch-48; ch=getchar();}}
    
    char a[55],b[55];
    int n,lena,lenb,cnt;
    bool check(int x,int y)
    {
        if((x==lena)&&(y==lenb)) return 1;
        if((x==lena)||(y==lenb)) return 0;
        if((a[x]=='?')||(a[x]==b[y])) return check(x+1,y+1);
        if(a[x]=='*') for(int i=y;i<=lenb;++i) if(check(x+1,i)) return 1;
        return 0;
    }
    int main()
    {
        while(scanf("%s",a)!=EOF)
        {
            //printf("a=%s
    ",a);
            lena=strlen(a);cnt=0;
            scanf("%d",&n);
            while(n--)
            {
                scanf("%s",b);
                lenb=strlen(b);
                if(check(0,0))
                {
                    //printf("%s
    ",b);
                    cnt++;
                }
            }
            printf("%d
    ",cnt);
        }
        return 0;
    }
    
    

    Problem F

    题意
    用给出的几个字符串组成最小的字符串
    分析
    string的比较学习了,需要(a+b<b+a),而不是(a<b)
    资料
    代码

    #include <cstdio>
    #include <cstring>
    #include <iostream>
    #include <algorithm>
    #include <string>
    #include <map>
    #include <queue>
    using namespace std;
    
    #define ll long long
    #define F(i,a,b) for(int i=a;i<=b;++i)
    #define R(i,a,b) for(int i=a;i<b;++i)
    #define mem(a,b) memset(a,b,sizeof(a))
    #pragma comment(linker, "/STACK:102400000,102400000")
    inline void read(int &x){x=0; char ch=getchar();while(ch<'0') ch=getchar();while(ch>='0'){x=x*10+ch-48; ch=getchar();}}
    
    int t,n;
    string a[10],temp;
    bool cmp(string a,string b)
    {
        return a+b<b+a;
    }
    int main()
    {
        for(scanf("%d",&t);t--;)
        {
            scanf("%d",&n);
            F(i,1,n) cin>>a[i];
            sort(a+1,a+1+n,cmp);
            F(i,1,n) cout<<a[i];
            puts("");
        }
        return 0;
    }
    
    

    Problem G

    题意
    找出出现了一次的数
    分析
    怎么都能做
    sort,map都行

  • 相关阅读:
    datetime模块
    python正则表达式练习题
    Python入门——turtle库的使用
    Python入门——Python程序语法元素
    Python入门——eval() 函数
    Python入门——实例1_温度转换
    Python入门——编程方式
    Python入门——程序的基本编写方法
    Python入门——编译和解释
    SQL中isnull、ifnull和nullif函数用法
  • 原文地址:https://www.cnblogs.com/chendl111/p/6403339.html
Copyright © 2020-2023  润新知