E 数菌落
分析
本题需要用到一个思想,叫做查并集思想。
标程
#include<bits/stdc++.h>
using namespace std;
struct jl
{
int x,y;
}q[1005];
int main()
{
int n,d,a[1005];
scanf("%d%d",&n,&d);
for(int i=0;i<n;i++)
{
a[i]=i;
scanf("%d%d",&q[i].x,&q[i].y);
}
for(int i=0;i<n;i++)
{
for(int j=i+1;j<n;j++)
{
if((q[i].x-q[j].x)*(q[i].x-q[j].x)+(q[i].y-q[j].y)*(q[i].y-q[j].y)<=d*d)
{
if(a[i]>a[j])
{
a[i]=a[j];
}
else
a[j]=a[i];
}
}
}
int ans=0;
for(int i=0;i<n;i++)
{
if(a[i]==i)
ans++;
}
printf("%d",ans);
}
H 编故事
分析
找了一下午bug的一道题,一度心态爆炸,最后的原因竟然是自己班门弄斧,学艺不精,把无穷大0x3f3f3f3f写成了0x3f3f3f。本题思路为将所有人的步子放在一个整体数组里进行排序,然后用尺取法进行判断
尺取法
1.将左右端点都初始化为0,然后将右端点推到满足题意的位置。
2.将左端点向右移动一个单位,若该区间仍满足题意,继续推动左端点。若不满足题意,则推动右端点至满足题意的位置。
3.一直循环第二步骤,更新答案,直到右端点推到最右端以外
标程
#include<bits/stdc++.h>
using namespace std;
struct man
{
long long step,home;
}q[500100];
int cmp(man a,man b)
{
return a.step<b.step;
}
int main()
{
long long n,k;
scanf("%lld%lld",&n,&k);
for(int i=0;i<5*n;i++)
{
scanf("%lld",&q[i].step);
q[i].home=i/5;
}
sort(q,q+5*n,cmp);
long long book[100005],l=0,r=0,ans=0x3f3f3f3f,all=0;
memset(book,0,sizeof(book));
while(r<5*n)
{
while(all<n&& r<5*n)
{
if(book[q[r].home]==0)
all++;
book[q[r].home]++;
r++;
}
if(all==n)
{
if(k>=q[r-1].step-q[l].step)
{
ans=min(ans,q[r-1].step-q[l].step);
}
book[q[l].home]--;
if(book[q[l].home]==0)
{
all--;
}
l++;
}
}
if(ans==0x3f3f3f3f)
printf("-1");
else
printf("%lld",ans);
}