zoukankan      html  css  js  c++  java
  • CodeForces

    开场连wa三发A题,差点心态崩了,还好坚持打完了,一共A了三题

    A题,判断能不能放第一个圆,能放的话,先手比赢

    #include<map>
    #include<set>
    #include<cmath>
    #include<queue>
    #include<stack>
    #include<vector>
    #include<cstdio>
    #include<cassert>
    #include<iomanip>
    #include<cstdlib>
    #include<cstring>
    #include<iostream>
    #include<algorithm>
    #define pi acos(-1.0)
    #define ll long long
    #define mod 1000000007
    #define ls l,m,rt<<1
    #define rs m+1,r,rt<<1|1
    #pragma comment(linker, "/STACK:1024000000,1024000000")
    
    using namespace std;
    
    const double g=10.0,eps=1e-7;
    const int N=1000+10,maxn=500+100,inf=0x3f3f3f;
    
    int main()
    {
        ios::sync_with_stdio(false);
        cin.tie(0);
        int a,b,r;
        cin>>a>>b>>r;
        if(a>=2*r&&b>=2*r)cout<<"First"<<endl;
        else cout<<"Second"<<endl;
        return 0;
    }
    /*********************
    
    *********************/
    A

    B题,数学题,模拟一下就好了,注意符号一定要在第一个位置,刚开始用gcd负号在第二个数那里了wa了一发

    #include<map>
    #include<set>
    #include<cmath>
    #include<queue>
    #include<stack>
    #include<vector>
    #include<cstdio>
    #include<cassert>
    #include<iomanip>
    #include<cstdlib>
    #include<cstring>
    #include<iostream>
    #include<algorithm>
    #define pi acos(-1.0)
    #define ll long long
    #define mod 1000000007
    #define ls l,m,rt<<1
    #define rs m+1,r,rt<<1|1
    #pragma comment(linker, "/STACK:1024000000,1024000000")
    
    using namespace std;
    
    const double g=10.0,eps=1e-12;
    const int N=100000+10,maxn=500+100,inf=0x3f3f3f;
    
    int gcd(int a,int b)
    {
        return b ? gcd(b,a%b):a;
    }
    int main()
    {
        ios::sync_with_stdio(false);
        cin.tie(0);
        int n,m,a,b,a1,b1;
        cin>>n>>m;
        for(int i=0;i<=n;i++)
        {
            cin>>a;
            if(i==0)a1=a;
        }
        for(int i=0;i<=m;i++)
        {
            cin>>b;
            if(i==0)b1=b;
        }
        if(n>m)
        {
            if(a1*b1>0)cout<<"Infinity"<<endl;
            else cout<<"-Infinity"<<endl;
        }
        else if(n<m)cout<<"0/1"<<endl;
        else
        {
            int x=gcd(a1,b1);
            a1/=x;b1/=x;
            if(a1*b1<0)cout<<"-"<<abs(a1)<<"/"<<abs(b1)<<endl;
            else cout<<abs(a1)<<"/"<<abs(b1)<<endl;
        }
        return 0;
    }
    /*********************
    
    *********************/
    B

    C题才是最水的题。。。搞一个记录最大的数组从后往前扫一边就出来了

    #include<map>
    #include<set>
    #include<cmath>
    #include<queue>
    #include<stack>
    #include<vector>
    #include<cstdio>
    #include<cassert>
    #include<iomanip>
    #include<cstdlib>
    #include<cstring>
    #include<iostream>
    #include<algorithm>
    #define pi acos(-1.0)
    #define ll long long
    #define mod 1000000007
    #define ls l,m,rt<<1
    #define rs m+1,r,rt<<1|1
    #pragma comment(linker, "/STACK:1024000000,1024000000")
    
    using namespace std;
    
    const double g=10.0,eps=1e-12;
    const int N=100000+10,maxn=500+100,inf=0x3f3f3f;
    
    int maxx[N];
    int main()
    {
        ios::sync_with_stdio(false);
        cin.tie(0);
        string s;
        cin>>s;
        maxx[s.size()]=0;
        for(int i=s.size()-1;i>=0;i--)
            maxx[i]=max(maxx[i+1],s[i]-'0');
        string ans="";
        for(int i=0;i<s.size();i++)
        {
            if(maxx[i]==s[i]-'0')ans+=s[i];
        }
        cout<<ans<<endl;
        return 0;
    }
    /*********************
    
    *********************/
    C

    D题,dfs,如果一个点能从两个方向到达的话,那就输出yes,用一个数组记录到达的位置

    #include<map>
    #include<set>
    #include<cmath>
    #include<queue>
    #include<stack>
    #include<vector>
    #include<cstdio>
    #include<cassert>
    #include<iomanip>
    #include<cstdlib>
    #include<cstring>
    #include<iostream>
    #include<algorithm>
    #define pi acos(-1.0)
    #define ll long long
    #define mod 1000000007
    #define ls l,m,rt<<1
    #define rs m+1,r,rt<<1|1
    #pragma comment(linker, "/STACK:1024000000,1024000000")
    
    using namespace std;
    
    const double g=10.0,eps=1e-7;
    const int N=1500+10,maxn=500+100,inf=0x3f3f3f;
    
    char ma[N][N];
    int dx[4]= {1,0,-1,0};
    int dy[4]= {0,1,0,-1};
    bool vis[N][N];
    int n,m,sx,sy;
    pair<int,int>v[N][N];
    bool ok(int x,int y)
    {
        if(ma[x][y]=='.'&&!vis[x][y])return 1;
        return 0;
    }
    void dfs(int x,int y)
    {
        int fx=x,fy=y;
        while(fx<0)fx+=n;
        fx%=n;
        while(fy<0)fy+=m;
        fy%=m;
        if(vis[fx][fy]&&(v[fx][fy].first!=x||v[fx][fy].second!=y))
        {
            cout<<"Yes"<<endl;
            exit(0);
        }
        if(!ok(fx,fy))return ;
        vis[fx][fy]=1;
        v[fx][fy]=make_pair(x,y);
        for(int i=0;i<4;i++)
            dfs(x+dx[i],y+dy[i]);
    }
    int main()
    {
        ios::sync_with_stdio(false);
        cin.tie(0);
        cin>>n>>m;
        for(int i=0;i<n;i++)
        {
            for(int j=0;j<m;j++)
            {
                cin>>ma[i][j];
                if(ma[i][j]=='S')
                {
                    sx=i;
                    sy=j;
                    ma[i][j]='.';
                }
            }
        }
        memset(vis,0,sizeof vis);
        dfs(sx,sy);
        cout<<"No"<<endl;
        return 0;
    }
    /*********************
    5 5
    ##.##
    #..##
    ..###
    .#S..
    ##.##
    *********************/
    D

     E题,计算几何,极角排序,先dfs一遍预处理出每个节点有多少子节点,然后dfs一遍,每个区间进行极角排序(刚开始以为只需要一遍极角排序就行了,后来

    #include<map>
    #include<set>
    #include<cmath>
    #include<queue>
    #include<stack>
    #include<vector>
    #include<cstdio>
    #include<cassert>
    #include<iomanip>
    #include<cstdlib>
    #include<cstring>
    #include<iostream>
    #include<algorithm>
    #define pi acos(-1.0)
    #define ll long long
    #define mod 1000000007
    #define ls l,m,rt<<1
    #define rs m+1,r,rt<<1|1
    #pragma comment(linker, "/STACK:1024000000,1024000000")
    
    using namespace std;
    
    const double g=10.0,eps=1e-12;
    const int N=2000+10,maxn=500+100,inf=0x3f3f3f;
    
    struct point {
        double x,y;
        int id;
    }p[N];
    point p0;
    vector<int>v[N];
    int sz[N],ans[N];
    bool comp(point p1,point p2)
    {
        double te=(p2.x-p0.x)*(p1.y-p0.y)-(p2.y-p0.y)*(p1.x-p0.x);
        if(te<0)return 1;
        return 0;
    }
    void dfs(int u,int fa)
    {
        sz[u]=1;
        for(int i=0;i<v[u].size();i++)
            if(v[u][i]!=fa)
            {
                dfs(v[u][i],u);
                sz[u]+=sz[v[u][i]];
            }
    }
    void dfssort(int u,int fa,int be,int en)
    {
        for(int i=be;i<en;i++)
           if(p[i].x<p[be].x||(p[i].x==p[be].x&&p[i].y<p[be].y))
              swap(p[i],p[be]);
        p0=p[be];
        ans[p[be].id]=u;
        sort(p+be+1,p+en,comp);
        int te=be;
        for(int i=0; i<v[u].size(); i++)
        {
            if(v[u][i]!=fa)
            {
                dfssort(v[u][i],u,te+1,te+sz[v[u][i]]+1);
                te+=sz[v[u][i]];
            }
        }
    }
    int main()
    {
        ios::sync_with_stdio(false);
        cin.tie(0);
        int n;
        cin>>n;
        for(int i=1;i<n;i++)
        {
            int a,b;
            cin>>a>>b;
            v[a].push_back(b);
            v[b].push_back(a);
        }
        for(int i=0;i<n;i++)
        {
            cin>>p[i].x>>p[i].y;
            p[i].id=i+1;
        }
        dfs(1,-1);
       // for(int i=1;i<=n;i++)cout<<sz[i]<<endl;
        dfssort(1,-1,0,n);
        for(int i=1;i<=n;i++)cout<<ans[i]<<" ";
        cout<<endl;
        return 0;
    }
    /*********************
    3
    1 3
    2 3
    0 0
    1 1
    2 0
    *********************/
    E

    发现这样子节点可能会坐标倒回来,有可能相交)

  • 相关阅读:
    华南师范大学应用数学考研真题
    scoped引起的deep与>>>改变elementUI的样式
    7.mogodb索引
    JS的undefined与null,==与===的区别
    vue上传图片到七牛云的思路与实现
    JS用正则处理文件名
    JS使用正则匹配字符串去掉多余符号
    6.mongoDB更新操作
    SSL证书相关之后缀名笔记
    vue一些常用的语法
  • 原文地址:https://www.cnblogs.com/acjiumeng/p/7211113.html
Copyright © 2011-2022 走看看