POJ 2280&&hdu 1661

本文介绍了一种在给定平面上的N个点,属性标记为0和1的情况下,通过找到一条直线使直线上的点溶解,同时最大化溶解一侧的点数的算法。通过暴力枚举和扫描线旋转等优化手段,实现O(n^2)的时间复杂度。

题意:给定平面上的N个点,属性分别标记为0和1,然后找一条直线,直线上的点全部溶解,一侧的1溶解,另一侧的0溶解。求出最多能溶解的点的个数。

思路:暴力枚举每个点,扫描线旋转。先做优化,如果一侧溶解0,则把属性为1的做关于当前枚举直线对称的点,这样统计一侧的点加上线上的点就是答案。O(n2).

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<algorithm>
 4 #include<cstring>
 5 #include<set>
 6 #include<stdio.h>
 7 #include<stdlib.h>
 8 #include<math.h>
 9 #define clc(a,b) memset(a,b,sizeof(a))
10 #define eps 1e-8
11 typedef long long LL;
12 const int mod=47000;
13 const int inf=0x3f3f3f3f;
14 using namespace std;
15 #define N 100010
16 
17 struct node
18 {
19     int x,y,r;
20     double ang;
21 }v[1010],rem[1010];
22 
23 int cmp(const struct node a,const struct node b)
24 {
25     if(a.ang<b.ang)
26         return 1;
27     else
28         return 0;
29 }
30 
31 int sig (double a)
32 {
33     if(fabs(a)<eps)
34         return 0;
35     else if(a>0)
36         return 1;
37     else
38         return -1;
39 }
40 
41 int cross(struct node a,struct node b,struct node c)
42 {
43     return (b.x-a.x)*(c.y-a.y)-(c.x-a.x)*(b.y-a.y);
44 }
45 
46 int main()
47 {
48     int n;
49     while(~scanf("%d",&n)&&n)
50     {
51         int ans=0;
52         for(int i=0;i<n;i++)
53         {
54             scanf("%d%d%d",&v[i].x,&v[i].y,&v[i].r);
55             rem[i]=v[i];
56         }
57         for(int i=0;i<n;i++)
58         {
59             for(int j=0;j<n;j++)
60             {
61                 v[j]=rem[j];
62                 if(v[j].r==1)
63                 {
64                     v[j].x=rem[i].x*2-v[j].x;
65                     v[j].y=rem[i].y*2-v[j].y;
66                 }
67                 v[j].ang=atan2(v[j].y-rem[i].y,v[j].x-rem[i].x);
68             }
69             swap(v[i],v[0]);
70             sort(v+1,v+n,cmp);
71             for(int j=1,t=2;j<n&&sig(v[j].ang)<=0;j++)
72             {
73                 int on=2;
74                 for( ;t<n&&cross(v[0],v[j],v[t])>=0;t++)
75                 {
76                     if(cross(v[0],v[j],v[t])==0)
77                     on++;
78                 }
79                 ans=max(ans,max(t-j+1,n-(t-j+1)+on));
80             }
81         }
82         cout<<ans<<endl;
83     }
84     return 0;
85 }
View Code

 

转载于:https://www.cnblogs.com/ITUPC/p/4852243.html

内容概要:本文系统介绍了算术优化算法(AOA)的基本原理、核心思想及Python实现方法,并通过图像分割的实际案例展示了其应用价值。AOA是一种基于种群的元启发式算法,其核心思想来源于四则运算,利用乘除运算进行全局勘探,加减运算进行局部开发,通过数学优化器加速函数(MOA)和数学优化概率(MOP)动态控制搜索过程,在全局探索与局部开发之间实现平衡。文章详细解析了算法的初始化、勘探与开发阶段的更新策略,并提供了完整的Python代码实现,结合Rastrigin函数进行测试验证。进一步地,以Flask框架搭建前后端分离系统,将AOA应用于图像分割任务,展示了其在实际工程中的可行性与高效性。最后,通过收敛速度、寻优精度等指标评估算法性能,并提出自适应参数调整、模型优化和并行计算等改进策略。; 适合人群:具备一定Python编程基础和优化算法基础知识的高校学生、科研人员及工程技术人员,尤其适合从事人工智能、图像处理、智能优化等领域的从业者;; 使用场景及目标:①理解元启发式算法的设计思想与实现机制;②掌握AOA在函数优化、图像分割等实际问题中的建模与求解方法;③学习如何将优化算法集成到Web系统中实现工程化应用;④为算法性能评估与改进提供实践参考; 阅读建议:建议读者结合代码逐行调试,深入理解算法流程中MOA与MOP的作用机制,尝试在不同测试函数上运行算法以观察性能差异,并可进一步扩展图像分割模块,引入更复杂的预处理或后处理技术以提升分割效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值