UVA1606

news/2024/10/30 9:35:47/

极角,扫描。
黑白点等价转换。
关键就是扫描这一小段。

int L = 0, R = 0;
int cnt = 2; // 分割线上的两个点
while( L<k ) {if( L==R ) { R = (R+1)%k; ++cnt; }while( L!=R&&Left( p[L],p[R] ) ) { R = (R+1)%k; ++cnt; }--cnt;++L;ans = max( ans,cnt );
} 

这里怎么扫描的?(盗用某评论区的图和文字)
在这里插入图片描述
为了简单,所有点都画到一个圆周上去了,现在已经将他们按照极角排序好了。
最开始L = R = 0,经过一轮循环后,R = 6,cnt = 7;
下一轮循环:L = 1,有5次R++和cnt++,但区间左端点变大,所以46行有个cnt–,最后cnt = 10
cnt统计的是区间[L, R]中点的个数,可以把这个区间想象成一个不超过180°的扇形。
当L++后,cnt不需要清零,只需要在原有的基础上,看看R自增了多少次,cnt就自增多少次。因为L++了,区间左端点变大,所以后面还有个cnt–
L==R时,为什么要++cnt?

if( L==R ) { R = (R+1)%k; ++cnt; }

LR时,直线上一共就2个点,为什么还要++呢?这是为了和后面cnt–统一。
后面的cnt–是为了当扫描起点(L)++后,去除旧的起点。而刚开始的时候L
R的时候并没有旧的起点,所以我们可以假装它有一个旧的起点(不存在),后面cnt–会删掉的,这样就与后面一致了。

#include <cstdio>
#include <cmath>
#include <algorithm>
using namespace std;const int N = 1000 + 5;struct Point{int x,y;double rad;bool operator < ( const Point &rhs ) const {return rad<rhs.rad;}
};
Point p[N],op[N];int n,color[N];// 点b,在原点(0,0)到点 a 的这条直线的左边吗? 是返回true 
bool Left( Point a, Point b ) {return a.x*b.y - a.y*b.x>=0;
}int solve() {int ans = 0;// 轮流做基点 for( int i=0; i<n; ++i ) {int k = 0; //统计除基点外的点for( int j=0; j<n; ++j ) {if( i!=j ) {//相对基点的坐标 p[k].x = op[j].x - op[i].x;p[k].y = op[j].y - op[i].y;//把黑点关于基点对称过去,这样只用算一个180度区间内的点就可以,而不用360度 ,缩小扫描区间 if( color[j] ) {p[k].x = -p[k].x; p[k].y = -p[k].y;}p[k].rad = atan2( p[k].y,p[k].x ); // 算极角++k; }}sort( p,p+k );int L = 0, R = 0;int cnt = 2; // 分割线上的两个点while( L<k ) {if( L==R ) { R = (R+1)%k; ++cnt; }while( L!=R&&Left( p[L],p[R] ) ) { R = (R+1)%k; ++cnt; }--cnt;++L;ans = max( ans,cnt );} }return ans;
}
int main()
{//freopen("in.txt","r",stdin);while(scanf("%d", &n) == 1 && n) {for(int i = 0; i < n; i++)scanf("%d%d%d", &op[i].x, &op[i].y, &color[i]);printf("%d\n", solve());}//fclose(stdin);return 0;} 

http://www.ppmy.cn/news/424933.html

相关文章

NO.15——使用Appium自动化测试爬取微信朋友圈数据

一、解析过程 本人使用锤子手机做测试&#xff0c;型号是YQ601&#xff0c;首先打开开发者模式确保手机能与mac相连&#xff0c;打开Appium客户端&#xff0c;配置参数如图 可以理解为Appuim继承自web端的selenium&#xff0c;同样可以执行一些自动化操作。Appium自带了一个XP…

xv6 6.S081 Lab8: fs

xv6 6.S081 Lab8: fs 写在前面实验介绍开始&#xff01;Large FileSymbolic links fs代码在这里。我的妈呀&#xff0c;终于要写完了&#xff0c;xv6的file system考察难度并不大&#xff0c;这里强烈推荐我工Ext2 Based File System&#xff0c;这里可以给一下参考代码与参考结…

Walllys/DR6018-S IPQ6010/IPQ6018/IPQ6000

Walllys/DR6018-S IPQ6010/IPQ6018/IPQ6000 Quad-core ARM 64bit A53 1.8GHz Processor Support OpenWRT, Support:QCN9074 WiFi Card Support OpenWRT  IPQ6010  802.11ax  2x2 2.4G&5G  DR6018-S IPQ6010/IPQ6018/IPQ6000 Quad-core ARM 64bit A53 1.8GHz Processor…

Android 视频 美颜SDK对比

Android 视频 美颜小结 美颜SDK美颜的本质Android 视频 美颜SDK对比 美颜SDK 蓝色AR 优点&#xff1a;文档规范 技术支持及时 价格适中 缺点&#xff1a;问题较多 包集成偏大 涂图 特点&#xff1a;前YY团队成员&#xff0c;10W 优点&#xff1a; 缺点&#xff1a; 商汤 特点…

YY/T 9706.106-2021医用电气设备 第1-6部分:基本安全和基本性能的通用要求 并列标准:可用性

目录 一、YY/T 9706.106-2021替换YY/T 1474-2016 二、YY/T 9706.106-2021医用电气设备 第1-6部分&#xff1a;基本安全和基本性能的通用要求 并列标准&#xff1a;可用性 IEC60601-1-6:2013 MOD 三、YY/T 1474-2016医疗器械可用性工程对医疗器械的应用&#xff0c;YY/T 1…

INSTALL_FAILED_SHARED_USER_INCOMPATIBLE错误解决

调试程序时项目设置了UID&#xff0c;使用不同的签名出现 Target device: smartisan-yq601-3fa1a5dc Installing APK: /Users/wangliang/workspace/emm-android/build/outputs/apk/emm-android-debug.apk Uploading file to: /data/local/tmp/com.xxx.vvv Installing com.poly…

医疗器械YY0505-2012、YY9706.102-2021检测报告,EMC电磁兼容标准解析

前言 电磁兼容性&#xff08;ElectromagneTIc CompaTIbility&#xff0c;EMC&#xff09;是指设备或系统在其电磁环境中能正常工作且不对该环境中任何事物构成不能承受的电磁骚扰的能力&#xff3b;1-2&#xff3d;。电磁兼容性标准即是对设备或系统的这个能力提出的要求。对医…

GY-906

MLX90614 系列红外测温模块的原理及应用 南京航空航天大学 曾德志 摘要&#xff1a; MLX90614 系列模块是一组通用的红外测温模块。在出厂前该模块已进行校验及线 性化&#xff0c;具有非接触、体积小、精度高&#xff0c;成本低等优点。被测目标温度和环境温度能通过单通…