ACdream手速赛2简单题解

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;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值