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