UVA - 1606 Amphiphilic Carbon Molecules(极角排序+扫描法+计算几何)

例题8-6 UVA1606 Amphiphilic Carbon Molecules(43行AC代码) 紫书刷题进行中,题解系列【GitHub|优快云】 例题8-6 UVA1606 Amphiphilic Carbon Molecules(43行AC代码) 题目大意 在笛卡尔坐标系中给出n个点的坐标,点有黑白两种颜色,问用一个直板分割平面,如何令平面一侧的白点数目和另一侧的黑点数目和最大(在直板上的点全部加入总和) 思路分析 通过分析,可假设直板一定至少经过两个点,如果不是,则可以通过平移得到该状... 阅读详情

题目链接:

https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=4481


题目大意:

平面上有 n 个点, 每个点为白点或黑点。现在需要放置一条隔板,使得隔板一侧的黑色点数加上另一侧白色点数的和最大。


解题过程:

这是人生第一道 AC 的计算几何题!
由于之前一直没接触过这种题,紫书上的分析也看不懂,一言不合就让我极角排序、叉乘,根本没学过啊QAQ。
然后翻了很多博客,重学了一下极坐标,可算是弄明白了。


题目分析:

首先这题最简单的想法是枚举所有可能的挡板,这样需要枚举两个点,然后统计两端的点。枚举是 n×n, 统计也是 n,总共时间复杂度是 n^3。显然是超时的。

然后扫描法的思想是,按照一定顺序枚举,这样可以动态的维护一个量,省去了扫描时的 n。

所以这题正解是枚举每一个点当作基点,然后计算每个点相对于基点的极角,进行极角排序。然后按极角的大小进行旋转时的枚举。每旋转一次可以根据之前统计的点的个数进行动态的更新(这就是“维护”)。

这题有个可以优化的地方,如果一个点是黑点的话,可以把他映射到关于基点对称的地方去,视为白点。这样扫描的时候只需要统计白点就够了。然后扫描的时候只从扫描 180 度即可。

判断是否超过 180 度用叉乘,a×b = |a| * |b| * sin<a,b>,两个点叉乘用坐标计算是,x1*y2 - y1*x2 因为向量的模一定是正的,所以只要判断这个叉乘正负,就可以判断 sin 的正负了,即是否超过 180 度。


AC代码:

#include<bits/stdc++.h>
using namespace std;

const int MAX = 1005;

struct Node {
    int x, y;
    int color;
    double rad;
}raw_data[MAX], data[MAX];

bool operator < (const struct Node &a, const struct Node &b) {
    return a.rad < b.rad;
}

int n, ans;

//用叉乘判断角度是否大于180度,即sin值。
bool Turn(Node &a, Node &b) {
    return a.x * b.y >= a.y * b.x;
}

void solve() {
    if (n <= 3) {
        ans = n;
        return;
    }
    ans = 0;

    //枚举每一个点当多基点
    for (int i = 0; i < n; i++) {
        int k = 0;
        for (int j = 0; j < n; j++) {
            if (i == j)
                continue;

            //计算每个点关于基点的相对坐标。
            data[k].x = raw_data[j].x - raw_data[i].x;
            data[k].y = raw_data[j].y - raw_data[i].y;

            //如果是黑点的话,那么映射到关于基点对称的地方,这样扫描的时候只记录白点就够了。
            if (raw_data[j].color) {
                data[k].x *= -1;
                data[k].y *= -1;
            }
            //求极角
            data[k].rad = atan2(data[k].y, data[k].x);
            k++;
        }

        //极角排序
        sort(data, data + k);

        //L为与基点相连的点,R为扫描线。
        int L = 0, R = 0, cnt = 1;

        //枚举每一个点与基点相连当作挡板。
        while (L < k) {
            if (L == R) {
                R = (R + 1) % k;
                cnt++;
            }

            //扫描的时候只扫描一侧,保证扫描线与挡板的夹角不超过180度。
            while (L != R && Turn(data[L], data[R])) {
                cnt++;
                R = (R + 1) % k;
            }
            ans = max(ans, cnt);
            //挡板旋转。
            L++;
            //由于挡板旋转,与基点相连的点不在挡板上了,减去1。
            cnt--;
        }
    }
}

int main() {
    while (cin >> n && n) {
        for (int i = 0; i < n; i++) {
            cin >> raw_data[i].x >> raw_data[i].y >> raw_data[i].color;
        }
        solve();
        cout << ans << endl;
    }
}
[扫描法] UVa1606 Amphiphilic Carbon Molecules 两性亲分子 (极角排序+向量叉积) 题目 平面上有 n 个点,每个点不是黑的就是白的,现在要放一个隔板,把它们分成两部分,使得一侧的白点数加上另一侧的黑点数最多。 uva1606 代码 #include &lt;cstdio&gt; #include &lt;cstring&gt; #include &lt;cmath&gt; #include &lt;cstdlib&gt; #include &lt;algorit... 阅读详情

相关推荐

图解基站机房:AAU、RRU与BBU之间的线缆连接与规格选择

本文以图解方式详解了5G基站机房中AAU、RRU与BBU三大核心设备之间的线缆连接方案与规格选择。重点阐述了电力线(如2×10 mm²直流电缆)、数据光缆(如野战光缆与波分复用)及射频馈线的功能、选型标准与实战布线法则,为通信工程部署与维护提供清晰指导。

weixin_29306011的博客 499

Amphiphilic Carbon Molecules极角排序、扫描线

Shanghai Hypercomputers, the world‘s largest computer chip manufacturer, has invented a new class of nanoparticles called Amphiphilic Carbon Molecules (ACMs). ACMs are semiconductors. It means that th...

qq_40688707的博客 450

DESeq2差异分析结果不会看?用这个R脚本5分钟生成发表级火山图和热图

本文详细介绍了如何使用R语言快速可视化DESeq2差异分析结果,5分钟内生成可直接用于论文发表的火山图和热图。通过解析DESeq2数据结构、展示ggplot2和EnhancedVolcano包的绘图技巧,以及pheatmap包的热图定制方法,帮助研究者高效呈现差异表达基因分析结果。

weixin_30326515的博客 340

Amphiphilic Carbon Molecules( UVA 1606)

链接 : 地址 紫书题,很经典 题意 p-238 就是给你N个点有黑有白,给你一个挡板,问挡板一边黑子加一边白子的最大值是?挡板上的可看做任意一边的 方法 随便选一个点作为原点 把所有坐标转化成相对坐标,再选一个点连起来作为一个轴,然后旋转 参考:https://blog.youkuaiyun.com/u014800748/article/details/47952253 #include &lt;...

神回 352

Jetson Orin NX深度学习环境配置全攻略:从JetPack到PyTorch避坑指南

本文提供Jetson Orin NX深度学习环境配置的完整避坑指南。重点讲解如何正确利用JetPack SDK作为系统基石,使用Miniforge管理Python环境,并安装与CUDA版本严格匹配的PyTorch特供版本。通过详细的步骤和验证方法,帮助开发者在ARM架构的嵌入式平台上高效搭建稳定的AI开发工作站。

yolo5detector的博客 272

避坑指南:用Adams做滚珠丝杠仿真时90%人会遇到的3个建模错误

本文针对使用Adams进行滚珠丝杠动力学仿真时常见的三大建模错误,提供了详细的避坑指南。重点解析了如何避免因直接导入CAD几何体导致的性能与精度问题,科学设置接触参数以提升计算效率与结果平滑度,以及通过规范的命名与组织管理模型,确保仿真过程高效可靠。

gin88的博客 573

Amphiphilic Carbon Molecules UVA - 1606 两亲性分子 扫描法

题目:https://vjudge.net/problem/UVA-1606  扫描法。扫描法类似于一种带有顺序的枚举法。例如,从左到右考虑数组的各个元素,也可以说从左到右“扫描”。它和普通枚举法的重要区别是:扫描法往往在枚举时维护一些重要的量,从而简化计算。 【分析】 不妨假设隔板一定经过至少两个点(否则可以移动隔板使其经过两个点,并且总数不会变小),则最简单的想法是:枚举两个点,然后输出两...

Nicolas的博客 439

GB/T 27930-2023协议升级与CANoe仿真测试实践

本文深入解析GB/T 27930-2023协议的核心升级,包括A/B类系统分类与EVIN码引入,并详细指导如何使用CANoe搭建仿真测试环境、编写CAPL脚本及利用DLL库进行一致性验证与故障注入测试,助力开发人员确保电动汽车充电通信的合规性与稳定性。

y7z8a的博客 540

1606 - Amphiphilic Carbon Molecules

Shanghai Hypercomputers,the world's largest computer chip manufacturer, has invented a new class ofnanoparticles called Amphiphilic Carbon Molecules (ACMs). ACMs aresemiconductors. It means that they

gaoxiangnumber1——Gao Xiang's Blog 553

单细胞实战之数据净化三部曲:细胞周期校正、双胞体剔除与RNA污染清理——技术解析与实战指南

本文深入解析单细胞数据分析中至关重要的数据净化步骤,即细胞周期校正、双胞体剔除与RNA污染清理。通过实战代码演示与原理剖析,指导读者如何有效识别并去除技术噪音,从而获得更纯净、可靠的数据,为后续的细胞分群、差异表达等高级分析奠定坚实基础。

weixin_29274337的博客 205

Vue2 - 最新详细实现接入天地图详细配置流程及示例代码教程,提供获取用户当前定位的城市名称及省市区数据、精准经纬度信息、IP属地定位、地图搜索标点等示例,解决天地图跨域报错/页面白屏/定位不准问题

vue2,nuxt2,天地图,使用教程,vue接入国家天地图,定位api,ip属地定位,获取用户当前位置数据,省市区,地图不显示,白屏,报错,vue2如何使用天地图,地图选点,cors跨域,白名单设置了还是不行,vue项目调用天地图api实现定位,Vue2中使用天地图,详细教程,天地图申请密钥key教程,经纬度,经纬度不准确,一直定位北京,定位在北京不准怎么办,nuxt项目天地图,网站,网页,h5页面,地图显示不全,获取当前定位,如何使用天地图,拿到客户ip地址定位城市名称,距离计算,实时搜索地址逆解析,天

🏆 前端领域优质创作者 5326

UVa 1606 Amphiphilic Carbon Molecules

本文探讨了两亲性碳分子(ACMs)溶解的最优化问题。给定N个具有亲水/疏水特性的粒子坐标,要求放置一条分隔直线使得溶解粒子数最大化。算法基于几何扫描技术,通过枚举每一个点作为候选基点,将其他点转换为极角坐标,利用滑动窗口寻找最优直线方向。其中,疏水粒子通过极角翻转被统一处理。最终算法复杂度为O(N²logN),适用于N≤1000的规模。实验证明该方法能有效求解最多可溶解粒子数,为材料工程应用提供了计算支持。

寂静山林 1019

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

UVA1606 (Amphiphilic Carbon Molecules)(极角排序,扫描)

UVA1606 (Amphiphilic Carbon Molecules)(极角排序,扫描法) 题目大意:平面上有n个点,每个点为白点或者黑点。现在需放置一条隔板,使得隔板一侧的白点数加上另一侧的黑点数总书最大。隔板上的点可以看作是在任意一侧。 思路分析: (1)、如果枚举两点,以两点所在的直线作为隔板,统计隔板两侧的点的分布,时间复杂度为O(n3),会超时。 (2)、通过枚举基准点,以基准点为坐标系原点,计算其余点的相对坐标,并按照极角排序。将基准点和除基准点的另外一个点的连线作为隔板,扫描整张图,动态

WedsonLin的博客 368

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

UVA - 1606 Amphiphilic Carbon Molecules 【极角排序+扫描法】

题目链接:https://cn.vjudge.net/problem/UVA-1606 题意: 直角坐标上有若干个白点和黑点,用一块隔板隔开这些点,一边只计算白点个数另一半只计算黑点个数,如果正好位于隔板上的点,不论黑白都计算,问能计算的点数最多有几个; 思路:(算是做过比较痛苦的题了吧,全程就题目读懂了,思路都是看别人的) 先讲一些基础内容: 极角排序:极角排序是根据角度大小顺序排序的...

Y390d的博客 347

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

UVa1606 Amphiphilic Carbon Molecules(极角排序+扫描线)

题目链接 1.题目大意:平面上有若干点,每个点为黑点或白点,现在需要放置一块隔板,使隔板一侧的白点数加上另外一侧的黑点数总数最大,隔板上的点可以看做任意一侧 2.先分析一下LRJ老师的思路:假设隔板至少经过两个点,那么最简单的想法是枚举任意两个点构成的直线并按题意统计,时间复杂度O(n3),肯定超时。那么,先枚举一个基准点,将一条直线绕这个点旋转,每当直线扫过一个点,就可以动态修改。由于扫描直接...

Happig的博客 378

Amphiphilic Carbon Molecules UVA - 1606

题目简述: 图上n个点,有黑色和白色。选一条直线,统计直线一端的黑点数和另一端的白点数之和,求这个数的最大值。 题目分析:很巧妙的解法,可以确定两个点连接一条直线,选其中一个点为基准点,做其余点相对于他的坐标,还有这个点的极角(atan2) #include <bits/stdc++.h> using namespace std; const int maxn=1e3+10; int ...

qq_42825058的博客 928

Uva1606 Amphiphilic Carbon Molecules【例题8-6】【极角扫描法】【不懂!】

极角扫描法。。。然后并不懂!

GuoZLH的博客 1097

uva 1606 Amphiphilic Carbon Molecules

题目:https://vjudge.net/problem/UVA-1606 这道题要想处理得很精细,技巧太强。lrj处理得真的秒 #include<iostream> #include<algorithm> #include<queue> #include<cmath> #include<math.h> #include<string> #include<string.h> #include<map> .

qq_35752161的博客 244

[UVA] Amphiphilic Carbon Molecules

题目:https://vjudge.net/problem/UVA-1606 #include<iostream> #include<cstdio> #include<cstring> #include<map> #include<vector> #include<algorithm> #include<string...

weixin_37992828的博客 312

UVa UVA1606 Amphiphilic Carbon Molecules

1.任意枚举两个点计算两边黑点加白点最大值 2.任选一个基准点,引一根直线绕着转,计算两边黑点加白点最大值; 对于2,再优化一下,将其他点较基准点的极角排序: 一个小技巧:将黑点关于基准点对称就相当于白点了,于是只要计算直线一边的点的数目最大值就好了 注:当中遇到了一个函数atan2:正表示从 X 轴逆时针旋转的角度,结果为负表示从 X 轴顺时针旋转的角度 #includ

BRCOCOLI的博客 488

Amphiphilic Carbon Molecules UVA - 1606(扫描线+极角排序)

题意 给你一个平面上的n个点,有白点与黑点,问你怎么插入一个隔板使得隔板左右的黑白点数相加值最大。 思路 我们让隔板至少经过两个点,因为隔壁上的点属于左右两边的点,所以我们可以这么操作。我们枚举每个点,对于其他点建立与这个点的相对坐标,然后极角排序一发,接着就是枚举每两个点设置隔板,求隔板两边的黑白点数了。朴素的做法是我们设i为基准点,l为与i形成隔板的点,r为旋转点,我们让i与l不动,旋转...

leekerian的博客 250

两亲性分子(Amphiphilic Carbon Molecules,Uva 1606)

原题链接 分析:假设隔板一定经过两点,则可以根据两点的枚举进行统计。首先可以枚举一个基准点,再根据枚举的另一个点进行隔板的枚举对点数进行统计。在进行枚举之前算出其余点基于基准点的极角进行升序排列,之后再进行枚举统计。 #include #include #include #include #include #include #include #include #include #include

Shiki_05的博客 779

UVA - 1606 Amphiphilic Carbon Molecules (计算几何,扫描法)

平面上给你一些具有黑或白颜色的点,让你设置一个隔板,使得隔板一侧的黑点加上另一侧的白点数最多。隔板上的点可视作任意一侧。 易知一定存在一个隔板穿过两个点且最优,因此可以先固定以一个点为原点,将其他点中的黑点移到对称的位置,并将所有点按极角排序,然后双指针遍历其他点,利用尺取法维护一个角度不超过180°的区间(算角度是否大于180°可以用叉积)。对每个点都算一遍,取最大区间长度即为最终答案。 区...

weixin_30318645的博客 121

uva1606 Amphiphilic Carbon Molecules

题目的主要思想在于依次选定一个节点,然后再选定剩下的另外一个节点,然后判断以这两个节点确定的直线作为边界,相应的黑色节点的个数以及白色节点的个数的最大值,这里也使用了一个很重要的方法,将黑色节点的位置进行中心对称,这样就将求解白色节点以及黑色节点的个数统一起来了,直接求出节点数然后取最大值就行了,具体实现见如下代码: #include #include #include #include #in

zju2016的博客 349
上一篇: 社交网络图中结点的“重要性“计算(Dijkstra + SPFA + Floyd + 模板)
下一篇: 最长上升子序列(DP+模板)
ACM_Fish
博客等级 码龄10年 69粉丝 76原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值