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;
}