SCAU 18233 万湖之国的形成

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

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

输出格式
湖的个数

输入样例
3
0 0 5
10 0 5
11.1 0 2.5

输出样例
2

#include <iostream>
#include <algorithm>

using namespace std;

int book[100050]; //标记数组

struct Circle
{
    double x;
    double y;
    double r;
};

Circle circle[100050];


bool compare(Circle a,Circle b)
{
    return a.x+a.r<b.x+b.r; //以圆的右端点排序
}

int Find(int k)
{
    if(book[k]==k) return k; //如果没有被合并过,返回父节点的值
    else return book[k]=Find(book[k]); //如果该圆坑被合并过,找到父节点的值
    // !!!return book[k]=Find(book[k])
}

int main()
{
    int n;
    int num;
    cin>>n;
    num=n;
    for(int i=0; i<n; i++)
    {
        cin>>circle[i].x>>circle[i].y>>circle[i].r;
        book[i]=i; //一开始,每个圆坑都是自己的父节点,i就是父节点的值
    }
    sort(circle,circle+n,compare);
    for(int i=0; i<n; i++)
    {
        for(int j=i-1; j>=0; j--)
        {
            if(circle[j].x+circle[j].r<=circle[i].x-circle[i].r)
            {
                break;
            }
            if(((circle[j].x-circle[i].x)*(circle[j].x-circle[i].x)+(circle[j].y-circle[i].y)*(circle[j].y-circle[i].y))<(circle[j].r+circle[i].r)*(circle[j].r+circle[i].r))
            {
                int m,n;
                m=Find(i); //找到i父节点的值
                n=Find(j); //找到j父节点的值
                if(m!=n) //如果i,j父节点的值不同
                {
                    num--; //圆坑数量-1
                    book[m]=n; //再把两个圆坑合并为1个,父节点的值改为同一个
                }
            }
        }
    }
    cout<<num<<endl;
    return 0;
}

参考原文:

18233 万湖之国的形成_Del_G的博客-CSDN博客                                                                    18233 万湖之国的形成                                                       时间限制:2500MS  内存限制:65535K提交次数:0 通过次数:0题型: 编程题   语言: G++;GCC;VCDes...https://blog.csdn.net/Qinie_/article/details/80831081?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522165408751716782391890156%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=165408751716782391890156&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduend~default-1-80831081-null-null.142^v11^pc_search_result_control_group,157^v12^new_style1&utm_term=18233+%E4%B8%87%E6%B9%96%E4%B9%8B%E5%9B%BD%E7%9A%84%E5%BD%A2%E6%88%90&spm=1018.2226.3001.4187 

  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 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、付费专栏及课程。

余额充值