传送门:1194B
传送门:1194D
#include<iostream>
#include<algorithm>
#include<cstring>
#define ll long long
using namespace std;
int n, m;
string g[50005];
int a[50005];
int main()
{
int q;
scanf("%d", &q);
while(q--)
{
scanf("%d%d", &n, &m);
for(int i=1;i<=n;i++)
{
cin >> g[i];
g[i]='$'+g[i];
}
int minans=n*m;
for(int i=1;i<=n;i++)
{
a[i]=0;
for(int j=1;j<=m;j++)
{
if(g[i][j]=='.')
{
a[i]++;
}
}
}
for(int j=1;j<=m;j++)
{
int b=0;
for(int i=1;i<=n;i++)
{
if(g[i][j]=='.')
{
b++;
}
}
for(int i=1; i<=n;i++)
{
minans=min(minans, a[i]+b-(g[i][j]=='.'));
}
}
printf("%d\n",minans);
}
return 0;
}
找规律,打个表:
k | 循环节的长度 | 循环节 |
---|---|---|
3 | 4 | 0 1 1 1 |
4 | 3 | 0 1 1 |
5 | 3 | 0 1 1 |
6 | 7 | 0 1 1 0 1 1 1 |
7 | 3 | 0 1 1 |
8 | 3 | 0 1 1 |
9 | 10 | 0 1 1 0 1 1 0 1 1 1 |
10 | 3 | 0 1 1 |
… | … | … |
注:0表示先手必输;1表示先手必胜。
显然我们可以得到当k%3!=0时,他的循环节是一定的;k%3==0时,循环节长度为k+1,循环节最后有个数是1,前面的数以0 1 1循环
AC代码:
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdio>
#define ll long long
using namespace std;
int t;
ll n,k;
int main()
{
scanf("%d",&t);
while(t--)
{
scanf("%I64d%I64d",&n,&k);
if(k%3!=0)
{
int x=(n+1)%3;
if(x==1) printf("Bob\n");
else printf("Alice\n");
}
else
{
ll x=(n+1)%(k+1);
if(x%3==1) printf("Bob\n");
else printf("Alice\n");
}
}
return 0;
}