A题:
题意:给你一个矩阵,两个人轮流进行游戏,每个人的回合都要选择一个位置(i,j),把它置为1,前提是第i行和第j列都没有1.
思路:求出行和列中最小的闲置数,其就为游戏进行的次数。偶数为第二个人赢,否则为第一人赢。
#include
#include
#include
#include
#include
typedef long long ll;
using namespace std;
bool v1[55],v2[55];//v1为行,v2为列
int arr[55][55];
int n,m;
int main()
{
int t;
cin >> t;
while(t--)
{
cin >> n >> m;
memset(v1,0,sizeof(v1));
memset(v2,0,sizeof(v2));
int c1=n,c2=m;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
scanf("%d",&arr[i][j]);
if(arr[i][j])
{
if(!v1[i]) {v1[i]=1;c1--;}
if(!v2[j]) {v2[j]=1;c2--;}
}
}
}
int ans=min(c1,c2);
if(ans%2==0)
printf("Vivek\n");
else
printf("Ashish\n");
}
return 0;
}
B题:
题意:给你一个序列,序列中每个元素除了本身的值外还有一个值b,当b相等时两个元素不能交换,问你能不能将这个序列排成非严格递增的序列。
思路:只要可以进行交换(即有一个bi与bj不相等),这个序列就可以排序。如果不能排序,但其本身就是非严格递增的序列也可以。
写的有点累赘的部分。
#include
#include
#include
#include
#include
using namespace std;
struct node
{
int a,b;
}arr[505];
int n;
int main()
{
int t;
cin >> t;
while(t--)
{
cin >> n;
for(int i=0;i
C题:
题意:给你两个序列长度为n(元素的值为1-n),通过移动一个序列(整体移动,列如:a1->a3…an->a2),能使两个序列上ai=bi的最大数量。
思路:直接求每个元素到其对应位置需要左移多少次(当然可以右移,这里以左移为例),然后求移动次数出现最多次的就是最大匹配数了。
#include
#include
#include
#include
#include
#define MAX 200005
using namespace std;
int arr[MAX];
int b[MAX];
int num[MAX];
int n;
int main()
{
cin >> n;
int v;
for(int i=0;i
D题:
题意:给你一个图,让所有的G走出去,所有的B走不出去,你可以把空地变成墙(包括逃离点)。
思路:直接把B附近四格全部设为墙,如果附近有个G,那说明就不能实现(为什么这样会最优,如果封了其他地点,对G的影响不会更好,只会更糟,不多加证明了)然后从逃离点进行遍历,如果有个G点遍历不到,说明实现不了,否则可以全部逃离。
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include