算法题目|万湖之国

本文介绍了一种使用C++模拟万湖之国形成的算法。通过分析圆形坑的相交和包含关系,利用并查集数据结构来判断这些圆形坑是否形成独立的湖泊,最终计算出总湖泊数量。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目要求:万湖之国的形成
时间限制:10000MS 内存限制:65535K
提交次数:0 通过次数:0

语言:G++;GCC;VC
描述
N国原是一块平原上,没有湖,直到一颗小行星撞入大气层碎成成千上万的碎片,碎片再撞击地面形成
一个一个的坑, 下雨之后,最终形成万湖之国。
现在科学家想用计算机模拟万湖之国形成过程,假设每一块碎片撞击地面,都撞出一个园形坑,现在知道
每一个碎片造成的坑的圆心和半径,问每个坑都注满水后,最终形成多少个湖?

输入格式
第一行一个整数N,1<=N<=100,000,表示坑的数量
此后N行,每一行三个double实数,前两个数是圆心的坐标x和y,最后一个数是圆半径(不大于1000)
(数据随机产生,分布均匀)

分析:将题目中提及的坑抽象出来就是探讨圆与圆之间的关系,统计所有相交圆和内含圆的个数,然后用总圆个数减去相交圆和内含圆的个数即是题目中要求的湖的个数。所以现在的关键点转化成了求非相交圆和非内含圆的个数,但由于数据的产生是随机的,所以对于圆与圆之间的关系判断就变得比较复杂。不过,它数据产生是随机的,我们可以人为地让它变成不随机的。判断的复杂性主要是由于其大小我们难以预测,那我们就可以先给数据排个序,然后判断一个圆跟坐标在它前面的圆是否相交或内含,但一个圆跟另一个圆有交集时,我们将其归为一类,这里引入一种数据结构叫并查集,主要功能是将数据归类,最后统计总共有多少类就可以知道总共有多少个湖了。在C++中,我们用图来实现并查集。(当然你也可以用数组等其他结构来表示,只是用图可能会更加方便一些。)具体实现如下:

#include <iostream>
#include <algorithm>
#include <map>


using namespace std;
typedef long long ll;							//结果可能过大,所以要用long long,这里typedef是为了方便后面写代码
map<ll,ll>fa;								//存储圆的类

struct g							//定义圆
{
    double x,y,r;
    bool operator <(const g b) const      //定义圆比较的方法
    {
        return x+r<b.x+b.r;
    }
}a[100050];	//存储数据

ll findset(int i)		//若圆相交或内含,则归为一类
{
    if(fa[i]==i) return i;
    return fa[i]=findset(fa[i]);
}

int main()
{
    int n,m;
    cin>>n;
    m=n;
    for(int i=0;i<n;i++)
    {
        cin>>a[i].x>>a[i].y>>a[i].r;
        fa[i]=i;
    }
    sort(a,a+n);
    for(int i=0;i<n;i++)
    {
        for(int j=i-1;j>=0;j--)
        {
            if(a[j].x+a[j].r<=a[i].x-a[i].r)    break;
            if((a[i].x-a[j].x)*(a[i].x-a[j].x)+(a[i].y-a[j].y)*(a[i].y-a[j].y)<(a[i].r+a[j].r)*(a[i].r+a[j].r))
            {
                ll l=findset(i),r=findset(j);
                if(fa[l]!=r)  m--;
                fa[l]=r;
            }
        }
    }
    cout<<m<<endl;
    return 0;
}
下载Memrise并学习墨西哥西班牙语,西班牙语,法语,德语,日语(汉字),意大利语,韩语,中文,葡萄牙语,俄语,阿拉伯语,荷兰语,瑞典语,挪威语,波兰语,土耳其语,丹麦语甚至英语。 加入超过4,500人。玩得开心。学习您最喜欢的语言,并通过所取得的成就给自己留下深刻的印象。让真正的母语人士通过我们的“与当地人一起学习”视频剪辑,从家乡的街道上教您他们的语言。 试试看-您的第一堂课就在家里。 这就是我们与众不同的原因: 我们拥有幕后杀手学习科学。它可以加快您的学习速度,并帮助您记住新单词,就好像您的大脑一直在按“保存”按钮一样。并非您会注意到。您太忙于观看有趣的视频剪辑,在遗愿清单目的地中看到真实的当地人以及玩一些小测验游戏。教科书学习的反面。无论您在哪里忆念,都距教室一百英里。 然后好事发生了。您目前正在当地人要交谈。你冻结了吗?不,不在我们的手表上。您会回想起所学的关键词。你说话自然。虽然不完美,但仍然是很好的玩笑。你不用担心 你只是去做。您充满自信。你做到了。 麦克风掉落。 将Memrise下载至: –与当地人一起学习:我们邀请了真正的母语使用者,并将他们缩小到应用程序中。您的微型朋友可以帮助您学习有趣的会话短语。还有一些发誓的词。 –练习游戏:我们的科学在您的头脑中进行一对一的指导,同时您可以享受速度复习,听力技巧,难听的单词和经典复习的乐趣。 –提高您的发音:因此,当您说“ beaucoup”(很多)时,您永远不会意外地说出“ beau cul”(漂亮的屁股)。记录一下自己,我们的智能技术会告诉您是否正确或需要再次尝试。 –随处学习:下载您的课程,在没有信号,似乎陷于80年代的地方学习。 –养成一种娱乐习惯:根据需要学习或多或少学习。您每天只需要5分钟即可改善。非常适合使您的厕所休息更有趣。 Memrise,最佳语言学习应用程序,适用于:墨西哥西班牙语,西班牙语,法语,德语,日语(汉字),意大利语,韩语,中文,葡萄牙语,俄语,阿拉伯语,荷兰语,瑞典语,挪威语,波兰语,土耳其语,丹麦语甚至英语。 ———————– 请注意: 您需要Memrise订阅才能访问所有课程和功能。但是可用的课程和功能因设备的语言而异。 购买后,除非在当前付款期结束之前取消订阅,否则订阅将自动续订。您可以在您的Google Play商店帐户中管理或取消订阅。 ———————– 应用内权限–要启用Memrise应用的某些功能,我们可能需要征求您的许可。例如,如果您想练习发音技巧,我们会要求您使用麦克风。您可以随时在设置中更改权限。 Memrise:适用于想要学习墨西哥西班牙语,法语,德语,日语(汉字),意大利语,韩语,中文,葡萄牙语,俄语,阿拉伯语,荷兰语,瑞典语,挪威语,波兰语,土耳其语,丹麦语甚至英语的语言学习者。 MOD 独立的Android程序包; 重新打包了Android App Bundle(由KirIif'拆分了APKs Packer v4.3.2): •支持的CPU架构:armeabi-v7a,arm64-v8a,x86; •支持的屏幕DPI:lhdpi [120dpi],hdpi [240dpi],xhdpi [320dpi],xxhdpi [480dpi],xxxhdpi [640dpi]; •语言:多国语言; 高级订阅已解锁; 禁用/删除不需要的权限+接收者和服务; Analytics(分析)/ Crashlytics(崩溃)已禁用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值