【题解】AcWing 第51场周赛

115 篇文章 3 订阅
20 篇文章 0 订阅

4419. 上车

在这里插入图片描述
在这里插入图片描述
思路:最大容载量-现有乘客数>=2即可坐下

#include <bits/stdc++.h>
using namespace std;
int main()
{
    int n;
    cin>>n;
    int res=0;
    for(int i=0;i<n;i++)
    {
        int a,b;
        cin>>a>>b;
        if(b-a>=2)res++;
    }
    cout<<res<<endl;
    return 0;
}

4420. 连通分量

在这里插入图片描述
在这里插入图片描述
思路:
并查集求出每个连通块中点的个数,在每个*四周延申,求出四个方向不重复祖先的连通块中点的个数。

#include <bits/stdc++.h>
using namespace std;
const int N=1010,M=N*N;
int n,m;
int p[M],s[M];
char g[N][N];
int dx[4]={-1,0,1,0};
int dy[4]={0,1,0,-1};
int get(int x,int y)
{
	return x*m+y;
}
int find(int x)
{
	if(x!=p[x])p[x]=find(p[x]);
	return p[x];
}
int main()
{
	cin>>n>>m;
	for(int i=0;i<M;i++)p[i]=i,s[i]=1;
	for(int i=0;i<n;i++)cin>>g[i];
	for(int i=0;i<n;i++)
	{
		for(int j=0;j<m;j++)
		{
			if(g[i][j]=='.')
			{
				for(int k=0;k<4;k++)
				{
					int a=dx[k]+i,b=dy[k]+j;
					if(a>=0&&a<n&&b>=0&&b<m&&g[a][b]=='.')
					{
						int x=get(a,b),y=get(i,j);
						x=find(x),y=find(y);
						if(x!=y)
						{
							s[y]+=s[x];
							p[x]=y;
						}
					}
				}
			}
		}
	}
	for(int i=0;i<n;i++)
	{
		for(int j=0;j<m;j++)
		{
			if(g[i][j]=='.')cout<<'.';
			else
			{
				set<int>st;
				for(int k=0;k<4;k++)
				{
					int x=dx[k]+i,y=dy[k]+j;
					if(x>=0&&x<n&&y>=0&&y<m&&g[x][y]=='.')
					{
						int a=get(x,y);
						st.insert(find(a));
					}
				}
				int sum=1;
				for(auto x:st)sum+=s[x];
				cout<<sum%10;
			}
		}
		cout<<endl;
	}
	return 0;
}

4421. 信号

在这里插入图片描述
在这里插入图片描述
思路:
贪心。从前往后枚举所有没有wifi的点,从后往前枚举[i-r+1,i+r-1]也就是可以覆盖其的区间,查看是否有wifi点,如果有,则覆盖这个区间,如果没有则输出-1

#include <bits/stdc++.h>
using namespace std;
const int N=2010;
bool st[N],a[N];
int n,r;
int main()
{
	cin>>n>>r;
	for(int i=1;i<=n;i++)cin>>a[i];
	int res=0;
	for(int i=1;i<=n;i++)
	{
		if(!st[i])
		{
			bool f=false;
			for(int j=min(i+r-1,n);j>=max(i-r+1,1);j--)
			{
				if(a[j])
				{
					for(int k=min(j+r-1,n);k>=max(j-r+1,1);k--)
						st[k]=true;
					f=true;
					res++;
					break;
				}
			}
			if(!f)
			{
				cout<<-1<<endl;
				return 0;
			}
		}
	}
	cout<<res<<endl;
	return 0;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

leimingzeOuO

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值