CodeForces - 1365

CodeForces - 1365

A - Matrix Game

可用的行和可用的列的最小值就是两个人总共可以进行的回合数

int a[maxn][maxn],t,n,m,row[maxn],col[maxn];
int main()
{
    scanf("%d",&t);
    while(t--)
    {
        mem(row,0);mem(col,0);
        int num1=0,num2=0;
        scanf("%d%d",&n,&m);
        rep(i,1,n)
        {
            rep(j,1,m)
            {
                scanf("%d",&a[i][j]);
                if (a[i][j])
                {
                    row[i]=1;
                    col[j]=1;
                }
            }
        }
        rep(i,1,n)if (!row[i])num1++;
        rep(j,1,m)if (!col[j])num2++;
        if (min(num1,num2)%2==0)printf("Vivek\n");
        else printf("Ashish\n");
    }
    return 0;
}



B - Trouble Sort

如果数组b中既有0也有1,容易判断出来是可行的,输出YES
否则,就直接判断该a数组是否是非递减的

int t,n,a[maxn],x;
int main()
{
    scanf("%d",&t);
    while(t--)
    {
        bool mark0=false,mark1=false;
        scanf("%d",&n);
        rep(i,1,n)scanf("%d",&a[i]);
        rep(i,1,n)
        {
            scanf("%d",&x);
            if (x==0)mark0=true;
            if (x==1)mark1=true;
        }
        if (mark0&&mark1)printf("Yes\n");
        else
        {
            bool mark=true;
            rep(i,1,n-1)if (a[i+1]<a[i])mark=false;
            if (mark)printf("Yes\n");
            else printf("No\n");
        }
    }
    return 0;
}



C - Rotation Matching

因为两个数组都是1-n的全排列,所以将相等的两个数之间的相对距离都记录一下
判断移动k个距离最多可以产生多少对相等的数

int a[maxn],b[maxn],pos1[maxn],pos2[maxn],n,num[maxn],maxx=0;
int main()
{
    scanf("%d",&n);
    rep(i,1,n)scanf("%d",&a[i]),pos1[a[i]]=i;
    rep(i,1,n)scanf("%d",&b[i]),pos2[b[i]]=i;
    rep(i,1,n)
    {
        if (pos2[i]<=pos1[i])num[pos1[i]-pos2[i]]++;
        else num[n+pos1[i]-pos2[i]]++;
    }
    rep(i,0,n-1)maxx=max(maxx,num[i]);
    W(maxx);
    return 0;
}



D - Solve The Maze

如果‘B’和‘G’相邻,那么B一定可以到达G的位置并走G的路从而到达终点,显然是NO

如何限制B的移动?显然要框住B并且这个框要尽量小
那么就将它的上下左右都设置为'#'

限制完B之后,地图可能已经发生了一点变化了

如果s[n-1][m-1]不是'#',就跑一遍bfs,找到所有可达点
对于每个'G',判断是否可达
(如果每个‘G’都进行一遍bfs就超时了)

int t,n,m,x[4]={0,0,1,-1},y[4]={1,-1,0,0};
char s[maxn][maxn];
bool vis[maxn][maxn],ok=true;
struct node
{
    int x,y;
}tmp,tp;
void solve(int sx,int sy)
{
    rep(i,0,3)
    {
        tmp.x=sx+x[i];
        tmp.y=sy+y[i];
        if (tmp.x<0||tmp.y<0||tmp.x>=n||tmp.y>=m||s[tmp.x][tmp.y]=='B')continue;
        if (s[tmp.x][tmp.y]=='G')ok=false;
        s[tmp.x][tmp.y]='#';
    }
}
void bfs(int sx,int sy)
{
    vis[sx][sy]=true;
    tmp.x=sx,tmp.y=sy;
    queue<node>q;
    q.push(tmp);
    while(!q.empty())
    {
        tp=q.front();q.pop();
        rep(i,0,3)
        {
            tmp.x=tp.x+x[i];
            tmp.y=tp.y+y[i];
            if (tmp.x<0||tmp.y<0||tmp.x>=n||tmp.y>=m)continue;
            if (s[tmp.x][tmp.y]=='#'||vis[tmp.x][tmp.y])continue;
            vis[tmp.x][tmp.y]=true;
            q.push(tmp);
        }
    }
}
int main()
{
    scanf("%d",&t);
    while(t--)
    {
        mem(vis,false);
        ok=true;
        rep(i,0,50)rep(j,0,50)s[i][j]='&';
        scanf("%d%d",&n,&m);
        repp(i,0,n)scanf("%s",s[i]);
        repp(i,0,n)repp(j,0,m)if (s[i][j]=='B')solve(i,j);
        if (s[n-1][m-1]!='#')bfs(n-1,m-1);
        repp(i,0,n)repp(j,0,m)if (s[i][j]=='G'&&!vis[i][j])ok=false;
        if (ok)printf("Yes\n");
        else printf("No\n");
    }
    return 0;
}



E - Maximum Subsequence Value

如果n<=3就不讨论了,因为max(1,k-2)=1,显然是n个数直接进行或运算所得到的值
如果n>3,取3个数的原因是:
假设k=4,序列中需要有2个数同时拥有该位为1,要求更加苛刻
假设k=5,序列中需要有3个数同时拥有该位为1,要求显然更加苛刻
...
因此取三个数,就是最“划算的”
不知道自己这么理解是否科学

ll a[maxn],ans=0;
int n;
int main()
{
    scanf("%d",&n);
    rep(i,1,n)scanf("%lld",&a[i]);
    rep(i,1,n)rep(j,1,n)rep(k,1,n)ans=max(ans,a[i]|a[j]|a[k]);
    WW(ans);
    return 0;
}

你可能感兴趣的:(Codeforces)