题目让你统计字符串中不同的字符的数目是多少,按要求输出。
ans=min(相邻两个数的最大值, a[1], a[n]);
仔细一想的话就会发现最多只要2个就可以使矩阵块不连通。有几个要注意的地方。1.不连通、2.sum<=2时,一直是连通的。3.输出为1的时候要每个点尝试删除并判断是否连通,若连通,则为1.
#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
int dx[4]={0,1,0,-1};
int dy[4]={1,0,-1,0};
int qx[3000],qy[3000];
bool map[60][60],vis[60][60];
char st;
int bfs(int x,int y){
int h=1,t=1,cnt=0;
qx[1]=x;qy[1]=y;vis[x][y]=false;
while (h<=t){
x=qx[h];y=qy[h];cnt++;
for (int k=0;k<4;k++){
x+=dx[k];y+=dy[k];
if (map[x][y]&&vis[x][y]){
t++;qx[t]=x;qy[t]=y;
vis[x][y]=false;
}
x-=dx[k];y-=dy[k];
}
h++;
}
return cnt;
}
int main(){
int n,m;
while (~scanf("%d%d",&n,&m)){
int sum=0;getchar();
memset(map,false,sizeof(map));
for (int i=1;i<=n;i++){
for (int j=1;j<=m;j++){
st=getchar();
if (st=='#') sum++;
if (st=='#') map[i][j]=true;
}
getchar();
}
if (sum<=2){
printf("-1\n");
continue;
}
memset(vis,true,sizeof(vis));
bool flag=true;
for (int i=1;i<=n;i++){
for (int j=1;j<=m;j++) if (map[i][j]&&vis[i][j]){
int cnt=bfs(i,j);
if (cnt<sum) flag=false;
}
}
if (!flag){
printf("0\n");
continue;
}
int ans=2;
for (int i=1;i<=n;i++){
for (int j=1;j<=m;j++)if (map[i][j]){
map[i][j]=false;
for (int k=0;k<4;k++)if (map[i+dx[k]][j+dy[k]]){
memset(vis,true,sizeof(vis));
int cnt=bfs(i+dx[k],j+dy[k]);
if (cnt<sum-1){
ans=1;
}
}
map[i][j]=true;
}
}
printf("%d\n",ans);
}
return 0;
}
D、LCM Challenge
给出一个数N ,从1~N中任意取三个数,使得最小公倍数最大。
首先,相邻的大于1的两个数互质。
其次,我们先假设最大为N*(N-1)*(N-2),若N为奇数即为答案。N为偶数时,我们 考虑答案N*(N-1)*(N-3) ,此时,我们无法保证N 和N-3 互质,注意到N和N-3 同余 3.
所以,当N%3!=0时,即为答案。 当N%3==0时,(N-1)*(N-2)(N-3)即为答案。
#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
int main(){
long long n,ans;
while (~scanf("%d",&n)){
if (n<=2){
ans=n;
}
else if (n&1){
ans=n*(n-1)*(n-2);
}
else if (n%3) ans=n*(n-1)*(n-3);
else ans=(n-1)*(n-2)*(n-3);
printf("%lld\n",ans);
}
return 0;
}