uva 1606 amphiphilic carbon molecules【把缩写写出来,有惊喜】(滑动窗口)——yhx
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 they can be either conductors or insulators of electrons, and thus possess a property that is very
important for the computer chip industry. They are also amphiphilic molecules, which means parts
of them are hydrophilic while other parts of them are hydrophobic. Hydrophilic ACMs are soluble
in polar solvents (for example, water) but are insoluble in nonpolar solvents (for example, acetone).
Hydrophobic ACMs, on the contrary, are soluble in acetone but insoluble in water. Semiconductor
ACMs dissolved in either water or acetone can be used in the computer chip manufacturing process.
Fig.1
As a materials engineer at Shanghai
Hypercomputers, your job is to prepare
ACM solutions from ACM particles. You
go to your factory everyday at 8 am and
nd a batch of ACM particles on your
workbench. You prepare the ACM so-
lutions by dripping some water, as well
as some acetone, into those particles and
watch the ACMs dissolve in the solvents.
You always want to prepare unmixed solu-
tions, so you rst separate the ACM parti-
cles by placing an Insulating Carbon Par-
tition Card (ICPC) perpendicular to your
workbench. The ICPC is long enough to
completely separate the particles. You then drip water on one side of the ICPC and acetone on the
other side. The ICPC helps you obtain hydrophilic ACMs dissolved in water on one side and hydropho-
bic ACMs dissolved in acetone on the other side. If you happen to put the ICPC on top of some ACM
particles, those ACMs will be right at the border between the water solution and the acetone solution,
and they will be dissolved. Fig.1 shows your working situation.
Your daily job is very easy and boring, so your supervisor makes it a little bit more challenging by
asking you to dissolve as much ACMs into solution as possible. You know you have to be very careful
about where to put the ICPC since hydrophilic ACMs on the acetone side, or hydrophobic ACMs on
the water side, will not dissolve. As an experienced engineer, you also know that sometimes it can be
very difficult to nd the best position for the ICPC, so you decide to write a program to help you. You
have asked your supervisor to buy a special digital camera and have it installed above your workbench,
so that your program can obtain the exact positions and species (hydrophilic or hydrophobic) of each
ACM particle in a 2D pictures taken by the camera. The ICPC you put on your workbench will appear
as a line in the 2D pictures.
Input
There will be no more than 10 test cases. Each case starts with a line containing an integer N, which
is the number of ACM particles in the test case. N lines then follow. Each line contains three integers
x, y, r, where (x; y) is the position of the ACM particle in the 2D picture and r can be 0 or 1, standing
for the hydrophilic or hydrophobic type ACM respectively. The absolute value of x, y will be no larger
than 10000. You may assume that N is no more than 1000. N = 0 signies the end of the input and
need not be processed.
Output
For each test case, output a line containing a single integer, which is the maximum number of dissolved
ACM particles.
Note: Fig.2 shows the positions of ACM particles and the best ICPC position for the last test case in
the sample input.
#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
using namespace std;
#define M(a) memset(a,0,sizeof(a))
struct pnt
{
int x,y;
bool b;
double k;
}a[],t[];
bool cmp(const pnt &a,const pnt &b)
{
return a.k<b.k;
}
int max(int a,int b)
{
return a>b?a:b;
}
int main()
{
int i,j,k,m,n,p,q,x,y,z,ans,l,r,cnt;
while (scanf("%d",&n)&&n)
{
M(a);
M(t);
for (i=;i<=n;i++)
scanf("%d%d%d",&a[i].x,&a[i].y,&a[i].b);
if (n<=)
{
printf("%d\n",n);
continue;
}
ans=-;
for (i=;i<=n;i++)
{
k=;
for (j=;j<=n;j++)
if (i!=j)
{
k++;
t[k].x=a[j].x-a[i].x;
t[k].y=a[j].y-a[i].y;
if (a[j].b)
{
t[k].x=-t[k].x;
t[k].y=-t[k].y;
}
t[k].k=atan2(t[k].y,t[k].x);
}
sort(t+,t+k+,cmp);
for (l=,r=,cnt=;l<=k;l++)
{
if (r==l)
{
r=r%k+;
cnt++;
}
while (r!=l&&t[l].y*t[r].x<=t[l].x*t[r].y)
{
r=r%k+;
cnt++;
}
cnt--;
ans=max(ans,cnt);
}
}
printf("%d\n",ans);
}
}
题目里先后出现了ACM和ICPC,这一定只是巧合。
没有什么特殊的算法,但不好想,也有很多细节容易写错。
一定存在某种最优情况,分界线至少经过两个点。否则可以平移它使它经过两个点而不减少答案数。
对每个黑点,作关于原点(即枚举的那个点)的对称点,问题就转化为计算一边的点的个数。
枚举每个点,以该点为原点计算每个点的位置,按角度从小到大排序(不能直接用斜率k=tan,否则y轴上的点会出错。)于是用滑动窗口一边进一边出,枚举分界线的另一个点,每滑过左边的一个点就向右边滑动,由于每个点都会作为起点和终点滑过一次,算上排序,复杂度为O(nlogn)。避免O(n^2)的枚举+判断。
总复杂度为O(n^2logn)。
计数和滑动的地方容易写错,而且要考虑绕圈。
uva 1606 amphiphilic carbon molecules【把缩写写出来,有惊喜】(滑动窗口)——yhx的更多相关文章
- 【极角排序、扫描线】UVa 1606 - Amphiphilic Carbon Molecules(两亲性分子)
Shanghai Hypercomputers, the world's largest computer chip manufacturer, has invented a new class of ...
- UVa 1606 - Amphiphilic Carbon Molecules
链接: https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...
- UVA 1606 Amphiphilic Carbon Molecules 两亲性分子 (极角排序或叉积,扫描法)
任意线可以贪心移动到两点上.直接枚举O(n^3),会TLE. 所以采取扫描法,选基准点,然后根据极角或者两两做叉积比较进行排排序,然后扫一遍就好了.旋转的时候在O(1)时间推出下一种情况,总复杂度为O ...
- UVa 1606 Amphiphilic Carbon Molecules (扫描法+极角排序)
题意:平面上有 n 个点,每个点不是黑的就是白的,现在要放一个隔板,把它们分成两部分,使得一侧的白点数加上另一侧的黑点数最多. 析:这个题很容易想到的就是暴力,不妨假设隔板至少经过两个点,即使不经过也 ...
- UVA - 1606 Amphiphilic Carbon Molecules 极角扫描法
题目:点击查看题目 思路:这道题的解决思路是极角扫描法.极角扫描法的思想主要是先选择一个点作为基准点,然后求出各点对于该点的相对坐标,同时求出该坐标系下的极角,按照极角对点进行排序.然后选取点与基准点 ...
- UVA - 1606 Amphiphilic Carbon Molecules (计算几何,扫描法)
平面上给你一些具有黑或白颜色的点,让你设置一个隔板,使得隔板一侧的黑点加上另一侧的白点数最多.隔板上的点可视作任意一侧. 易知一定存在一个隔板穿过两个点且最优,因此可以先固定以一个点为原点,将其他点中 ...
- UVA - 1606 Amphiphilic Carbon Molecules(两亲性分子)(扫描法)
题意:平面上有n(n <= 1000)个点,每个点为白点或者黑点.现在需放置一条隔板,使得隔板一侧的白点数加上另一侧的黑点数总数最大.隔板上的点可以看做是在任意一侧. 分析:枚举每个基准点i,将 ...
- 【UVa】1606 Amphiphilic Carbon Molecules(计算几何)
题目 题目 分析 跟着lrj学的,理解了,然而不是很熟,还是发上来供以后复习 代码 #include <bits/stdc++.h> using namespace std; ; stru ...
- UVa 1606 (极角排序) Amphiphilic Carbon Molecules
如果,没有紫书上的翻译的话,我觉得我可能读不懂这道题.=_=|| 题意: 平面上有n个点,不是白点就是黑点.现在要放一条直线,使得直线一侧的白点与另一侧的黑点加起来数目最多.直线上的点可以看作位于直线 ...
随机推荐
- C#按回车Enter使输入焦点自动跳到下一个TextBox的方法收集
在录入界面中,用户往往需要按回车键时光标自动跳入下一个文本框,以方便录入操作.在C#中实现该功能有多种方法,以下是小编收集的不使用TAB键,而直接用回车键将光标转到下一个文本框的实现方法. 一.利用W ...
- 随心所欲导出你的 UI 界面到 PDF 文件
使用 C1PDF 控件可以导出文件到 PDF 文件,结合 .NET 平台特性你可以在任何客户端生成自定义报表.你可以打印任何 UI 界面,例如 DataGrid 导出到 PDF. 在本篇文章中我们将阐 ...
- 从零开始学习Linux(cp 命令)
功能: 复制文件或目录说明: cp指令用于复制文件或目录,如同时指定两个以上的文件或目录,且最后的目的地是一个已经存在的目录,则它会把前面指定的所有文件或目录复制到此目录中.若同时指定多个文件或目录, ...
- MyEclipse+Mysql (一)
MyEclipse连接Mysql数据库 准备工作:MyEclipse使用的是2013版,mysql Ver 14.14 Distrib 5.6.28 1.jar包的下载(jdbc驱动) 我 ...
- TeamCity配置笔记
1.编译sln 2.发布网站 3.重复代码检测 4.代码分析 5.单元测试&覆盖率测试 查看代码覆盖率 7.代码签入时自动触发编译 8.通知 1.在teamcity安装目录中找到TrayNot ...
- 程序中条用其他程序中已经存在的PERFORM
PARAMETERS p_sub(40) TYPE c. DATA fssub(40) TYPE c. fssub = p_sub. TRY. PERFORM (fssub) IN PROGR ...
- .NET破解之100%营销QQ辅助软件【更新】
应网友要求,更新一个以前的版本,效果如下: 更改方法 修改一:更改对象的可访问性 Assembly: RWXComLibrary, Version=2.1.0.3 Name: RWXComLibrar ...
- 【转】R语言笔记--颜色的使用
转自该网站:http://research.stowers-institute.org/efg/R/Color/Chart/ 科学可视化中常用的一些颜色表:http://geog.uoregon.ed ...
- Sharepoint学习笔记—习题系列--70-573习题解析 -(Q94-Q96)
Question 94You need to create a custom application that provides users with the ability to create a ...
- IOS异常日志记录与展现功能
在平常的APP开发过程中经常碰到程序遇到异常闪退的问题,通过日志可以把相关的详细错误信息进行记录,本实例要记录不管在哪个页面出错都要进行记录,这边使用到的日志记录插件CocoaLumberjack,以 ...