zoukankan      html  css  js  c++  java
  • 2019 ICPC Asia Nanjing Regional(现场赛)

     A. A Hard Problem

    找规律即可。

    #include <bits/stdc++.h>
    #define ll long long
    using namespace std;
    
    int main()
    {
        int t; scanf("%d",&t);
        while(t--)
        {
            ll n; scanf("%lld",&n);
            if(n==2) printf("2
    ");
            else
            {
                if(n%2==0) printf("%lld
    ",(n/2-1)+2);
                else printf("%lld
    ",n/2+2);
            }
        }
        return 0;
    }

    H. Prince and Princess

    假设c全为反对者,那么反对者一共有b+c。个人理解是,对于可询问的三个问题,只向对方询问“公主在哪个房间”这个问题。在支持者比反对者多的情况下,得到的正确回答一定比错误回答要多(支持者一定回答的是正确的,可以假设反对者都说出同一个错误的房间),那么只需要询问2*(b+c)+1次问题即可。但是当出现1 0 0这组特例的时候,支持者就是公主本人,所以输出0。

    #include <bits/stdc++.h>
    using namespace std;
    
    int main()
    {
        int a,b,c; scanf("%d%d%d",&a,&b,&c);
        if(a>b+c)
        {
            printf("YES
    ");
            if(a==1) printf("0
    ");
            else printf("%d
    ",(b+c)<<1 | 1);
        }
        else printf("NO
    ");
        return 0;
    }

    C. Digital Path

    用a,b,c,d分别记录该位置往下还可以走0个点,1个点,2个点,大于等于3个点的数量。将可以往下走0个点的位置的a值赋值位0,并对每一个位置进行dfs,即处理完所有可行的路径,最终递归将该位置的b,c,d值更新取模。在最终计算可行的路径之前,要判断出该位置是否是最大路径的起点,如果该位置可以被上下左右的任意位置走到,则肯定不是最大路径。

    #include <bits/stdc++.h>
    #define ll long long
    using namespace std;
    const ll mod=1e9+7;
    int n,m,k[5][5]={{-1,0},{0,-1},{1,0},{0,1}};
    
    struct node
    {
        int num;
        ll a,b,c,d;
        bool flag;
    }p[1005][1005];
    
    bool checkpoint(int x,int y)
    {
        if(x<=0 || x>n || y<=0 || y>m) return false;
        return true;
    }
    
    bool check1(int i,int j)
    {
        if(i-1>0 && p[i-1][j].num-p[i][j].num==1) return true;
        if(i+1<=n && p[i+1][j].num-p[i][j].num==1) return true;
        if(j-1>0 && p[i][j-1].num-p[i][j].num==1) return true;
        if(j+1<=m && p[i][j+1].num-p[i][j].num==1) return true;
        return false;
    }
    
    bool check2(int i,int j)
    {
        if(i-1>0 && p[i][j].num-p[i-1][j].num==1) return false;
        if(i+1<=n && p[i][j].num-p[i+1][j].num==1) return false;
        if(j-1>0 && p[i][j].num-p[i][j-1].num==1) return false;
        if(j+1<=m && p[i][j].num-p[i][j+1].num==1) return false;
        return true;
    }
    
    node dfs(int i,int j)
    {
        if(p[i][j].flag) return p[i][j];
        p[i][j].flag=true;
        for(int t=0;t<4;t++)
        {
            int nx=i+k[t][0],ny=j+k[t][1];
            if(checkpoint(nx,ny) && p[nx][ny].num-p[i][j].num==1)
            {
                node next=dfs(nx,ny);
                p[i][j].b=(p[i][j].b+next.a)%mod;
                p[i][j].c=(p[i][j].c+next.b)%mod;
                p[i][j].d=(p[i][j].d+next.c+next.d)%mod;
            }
        }
        return p[i][j];
    }
    
    int main()
    {
        scanf("%d%d",&n,&m);
        for(int i=1;i<=n;i++)
        {
            for(int j=1;j<=m;j++)
            {
                scanf("%d",&p[i][j].num);
                p[i][j].flag=false;
            }
        }
        for(int i=1;i<=n;i++)
        {
            for(int j=1;j<=m;j++)
            {
                if(check1(i,j)) p[i][j].a=0;
                else p[i][j].a=1;
            }
        }
        for(int i=1;i<=n;i++)
        {
            for(int j=1;j<=m;j++)
            {
                dfs(i,j);
            }
        }
        ll ans=0;
        for(int i=1;i<=n;i++)
        {
            for(int j=1;j<=m;j++)
            {
                if(check2(i,j)) ans=(ans+p[i][j].d)%mod;
            }
        }
        printf("%lld
    ",ans);
        return 0;
    }
  • 相关阅读:
    github设置添加SSH
    pythonanywhere笔记
    Python3x 爬取妹子图
    python3.4 百度API接口
    简易博客开发(8)----django1.9 博客部署到pythonanywhere上
    Python3.4+Django1.9+Bootstrap3
    docker搭建私有仓库之harbor
    docker新手常见问题和知识点
    node之sinopia搭建本地npm仓库
    rancher-HA快速搭建
  • 原文地址:https://www.cnblogs.com/benzikun/p/12188530.html
Copyright © 2011-2022 走看看