西南民族大学第十二届程序设计竞赛(同步赛)补题题解

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);
} 
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值