ACdream手速赛2简单题解

来源:互联网 发布:java final class 编辑:程序博客网 时间:2024/06/03 04:30

A、Boy or Girl

题目让你统计字符串中不同的字符的数目是多少,按要求输出。



B、Walking in the Rain

ans=min(相邻两个数的最大值, a[1], a[n]);


C、Cutting Figure

仔细一想的话就会发现最多只要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;}


0 0