A. Matrix Game
题目大意
给定一个n行m列由01构成的矩阵,每次可以在一个格子,那个格子所在的行和列上都没有1,将0变为1,Ashish先手,求谁先获胜
解题思路
统计没有1的行数和列数取最小的那个,然后判断其奇偶性
源码
#include <bits/stdc++.h>
#define MEM(a,b) memset((a),(b),sizeof(a))
#define rep(i,a,n) for (int i=a;i<n;i++)
typedef long long ll;
using namespace std;
const int MAXN=(int)100+5;
int mp[MAXN][MAXN];
int r[MAXN],c[MAXN];
int main()
{
int T,n,m;
cin>>T;
while (T--)
{
cin>>n>>m;
MEM(r,0);
MEM(c,0);
rep(i,0,n)rep(j,0,m)cin>>mp[i][j];
rep(i,0,n)rep(j,0,m)r[i]|=mp[i][j],c[j]|=mp[i][j];
int nc,nr;
nc=nr=0;
rep(i,0,n)nr+=(r[i]==0);
rep(i,0,m)nc+=(c[i]==0);
if(min(nc,nr)%2)cout<<"Ashish"<<endl;else cout<<"Vivek"<<endl;
}
return 0;
}
B. Trouble Sort
题目大意
只能交换不同类的数值的位置,判断是否能形成不单调递减数列
解题思路
如果数列中有多类,那么一定是可以形成的。
如果只有一个类,那么就判断一下输入就好了。
源码
#include <bits/stdc++.h>
#define DEBUG puts("Here is a BUG")
#define MEM(a,b) memset((a),(b),sizeof(a))
#define rep(i,a,n) for (int i=a;i<n;i++)
#define per(i,a,n) for (int i=n-1;i>=a;i--)
#define PI 3.1415926535897932626
#define all(a) a.begin(),a.end()
typedef long long ll;
using namespace std;
const double eps=1e-8;
const int MAXN=(int)1e5+5;
const int MOD=(int)1e9+7;
const int INF=0x3f3f3f3f;
const int dx[]={-1,1,0,0};
const int dy[]={0,0,-1,1};
int a[MAXN],b[MAXN],n;
bool solve()
{
bool flag=true;
for (int i = 0; i+1 < n; i++)
{
if(b[i]!=b[i+1]){flag=false;break;}
}
if(!flag)return true;
for (int i = 0; i+1 < n; i++)
{
if(a[i]>a[i+1])return false;
}
return true;
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
int T;
cin>>T;
while (T--)
{
cin>>n;
rep(i,0,n)cin>>a[i];
rep(i,0,n)cin>>b[i];
if(solve())cout<<"Yes"<<endl;else cout<<"No"<<endl;
}
return 0;
}
C. Rotation Matching
解题思路
统计相同数字所在位置的差值,统计相同差值的数量,输出最大的数量
源码
#include <bits/stdc++.h>
#define DEBUG puts("Here is a BUG")
#define MEM(a,b) memset((a),(b),sizeof(a))
#define rep(i,a,n) for (int i=a;i<n;i++)
#define per(i,a,n) for (int i=n-1;i>=a;i--)
#define PI 3.1415926535897932626
#define all(a) a.begin(),a.end()
typedef long long ll;
using namespace std;
const double eps=1e-8;
const int MAXN=(int)2e5+5;
const int MOD=(int)1e9+7;
const int INF=0x3f3f3f3f;
const int dx[]={-1,1,0,0};
const int dy[]={0,0,-1,1};
int a[MAXN],b[MAXN],c[MAXN];
int main()
{
int n;
cin>>n;
map<int,int>mp;
rep(i,0,n)cin>>a[i];
rep(i,0,n)c[b[i]]=i;
rep(i,0,n)mp[(i-c[a[i]]+n)%n]++;
int ans=0;
for (auto &&i : mp)ans=max(ans,i.second);
cout<<ans<<endl;
return 0;
}
D. Solve The Maze
解题思路
初始化的时候,根据贪心,在坏人的四周堵上墙,如果有好人直接与坏人相邻那么是不存在的
然后从终点DFS统计能和终点相连的好人的数量,判断是否与总数相等
源码
#include <bits/stdc++.h>
#define DEBUG puts("Here is a BUG")
#define MEM(a,b) memset((a),(b),sizeof(a))
#define rep(i,a,n) for (int i=a;i<n;i++)
#define per(i,a,n) for (int i=n-1;i>=a;i--)
#define PI 3.1415926535897932626
#define all(a) a.begin(),a.end()
typedef long long ll;
using namespace std;
const double eps=1e-8;
const int MAXN=(int)1e2+5;
const int MOD=(int)1e9+7;
const int INF=0x3f3f3f3f;
const int dx[]={-1,1,0,0};
const int dy[]={0,0,-1,1};
char mp[MAXN][MAXN];
int n,m,g;
bool init()
{
g=0;
rep(i,0,n)rep(j,0,m)
{
if(mp[i][j]=='B')
{
for (int k = 0; k < 4; k++)
{
int tx=dx[k]+i,ty=dy[k]+j;
if(tx>=0&&tx<n&&ty>=0&&ty<m&&mp[tx][ty]!='B'&&mp[tx][ty]!='#')
{
if(mp[tx][ty]=='G')return false;
else mp[tx][ty]='#';
}
}
}else if(mp[i][j]=='G')g++;
}
return true;
}
bool vis[MAXN][MAXN];
int dfs(int x,int y)
{
vis[x][y]=true;
int res=0;
if(mp[x][y]=='G')res++;
for (int k = 0; k < 4; k++)
{
int tx=dx[k]+x,ty=dy[k]+y;
if(tx>=0&&tx<n&&ty>=0&&ty<m&&mp[tx][ty]!='#'&&!vis[tx][ty])
{
res+=dfs(tx,ty);
}
}
return res;
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
int T;
cin>>T;
while (T--)
{
cin>>n>>m;
rep(i,0,n)cin>>mp[i];
if(!init()||mp[n-1][m-1]=='#'&&g||mp[n-1][m-1]=='B'){cout<<"No"<<endl;continue;}
MEM(vis,0);
if(dfs(n-1,m-1)==g)cout<<"Yes"<<endl;else cout<<"No"<<endl;
}
return 0;
}
E. Maximum Subsequence Value
解题思路
根据贪心我们取得数不会超过3个
然后枚举答案
时间复杂度$O(n^2)$
源码
#include <bits/stdc++.h>
#define DEBUG puts("Here is a BUG")
#define MEM(a,b) memset((a),(b),sizeof(a))
#define rep(i,a,n) for (int i=a;i<n;i++)
#define per(i,a,n) for (int i=n-1;i>=a;i--)
#define PI 3.1415926535897932626
#define all(a) a.begin(),a.end()
typedef long long ll;
using namespace std;
const double eps=1e-8;
const int MAXN=(int)1e5+5;
const int MOD=(int)1e9+7;
const int INF=0x3f3f3f3f;
const int dx[]={-1,1,0,0};
const int dy[]={0,0,-1,1};
ll a[MAXN];
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
int n;
cin>>n;
rep(i,0,n)cin>>a[i];
sort(a,a+n,greater<ll>());
if(n<=3)
{
ll ans=0;
rep(i,0,n)ans|=a[i];
cout<<ans<<endl;
}else
{
ll ans=0;
for (int i = 0; i < n; i++)
{
ll tmp=a[i],res=a[i];
for (int j = i+1; j < n; j++)res=max(res,tmp|a[j]);
tmp=res;
for (int j = i+1; j < n; j++)res=max(res,tmp|a[j]);
ans=max(ans,res);
}
cout<<ans<<endl;
}
return 0;
}