2016级算法第三次上机-E.ModricWang's Polygons
930 ModricWang's Polygons
思路
首先要想明白,哪些多边形可能是格点正多边形?
分情况考虑:
三角形不可能,因为边长为有理数的正三角形的面积为无理数,而格点三角形的面积为有理数,二者矛盾。
正四边形毫无疑问是可以的。
边数>4时,可以考虑无穷递降法:
以六边形为例,假如整点正六边形存在,一定有边长最小的一个,记作\(A_1 A_2 A_3 A_4 A_5 A_6\)。以\(A_2\)为中心,将\(A_1\)逆时针旋转90度,得到\(B_1\)。显然也是整点。类似定义\(B_2 ... B_6\),它们也都是整点。【注:上面用到如下结论:一个整点绕另一个整点旋转90度,得到的点仍然是整点。证明很容易。】如你所见,\(B_1 B_2 B_3 B_4 B_5 B_6\)是一个更小的整点正六边形,矛盾。
对于边数>4的其他情况,也可以用类似方法证明。
参考自这里
于是该问题就变成了统计格点正四边形的数量。考虑枚举任意两个点形成的线段,那么由这一条线段可以形成的格点正四边形只有两个,并且另外两个点的坐标是可以直接算出来的。因此只要枚举任意两点的组合,验证以这两个点为相邻两点的格点正四边形是否存在即可。
时间复杂度\(O(n^2)\),空间复杂度\(O(n)\)
代码
#include <bits/stdc++.h>
#define ll long long
#define mk make_pair
#define y1 yyy
using namespace std;
const int N = 1e3 + 5;
map<pair<int, int>, bool> M;
int x[N], y[N], n, ans;
int main() {
int T;
while (scanf("%d", &n) != EOF) {
ans = 0;
M.clear();
for (int i = 1; i <= n; i++) {
scanf("%d %d", x + i, y + i);
M[mk(x[i], y[i])] = 1;
}
for (int i = 1; i <= n; i++) {
for (int j = i + 1; j <= n; j++) {
int dx = y[j] - y[i];
int dy = x[i] - x[j];
int ok = 0;
if (M.count(mk(x[i] + dx, y[i] + dy)))
ok++;
if (M.count(mk(x[j] + dx, y[j] + dy)))
ok++;
if (ok == 2)
ans++;
ok = 0;
if (M.count(mk(x[i] - dx, y[i] - dy)))
ok++;
if (M.count(mk(x[j] - dx, y[j] - dy)))
ok++;
if (ok == 2)
ans++;
}
}
printf("%d\n", ans / 4);
}
2016级算法第三次上机-E.ModricWang's Polygons的更多相关文章
- 2016级算法第三次上机-F.ModricWang的导弹防御系统
936 ModricWang的导弹防御系统 思路 题意即为:给出一个长度为n的序列,求出其最长不降子序列. 考虑比较平凡的DP做法: 令\(nums[i]\) 表示这个序列,\(f[x]\) 表示以第 ...
- 2016级算法第三次上机-G.Winter is coming
904 Winter is coming 思路 难题.首先简化问题, \(n\) 个0与 \(m\) 个1排成一列,连续的0不能超过x个,连续的1不能超过y个,求排列方法数. 显然会想到这是动态规划. ...
- 2016级算法第三次上机-C.AlvinZH的奇幻猜想——三次方
905 AlvinZH的奇幻猜想--三次方 思路 中等题.题意简单,题目说得简单,把一个数分成多个立方数的和,问最小立方数个数. 脑子转得快的马上想到贪心,从最近的三次方数往下减,反正有1^3在最后撑 ...
- 2016级算法第三次上机-B.Bamboo和巧克力工厂
B Bamboo和巧克力工厂 分析 三条流水线的问题,依然是动态规划,但是涉及的切换种类比较多.比较易于拓展到n条流水线的方式是三层循环,外层是第k个机器手,里面两层代表可切换的流水线 核心dp语句: ...
- 2016级算法第三次上机-D.双十一的抉择
915 双十一的抉择 思路 中等题.简化题目:一共n个数,分成两组,使得两组的差最接近0,就是说要使两组数都尽可能的接近sum/2. 思路还是很混乱的,不知道如何下手,暴力也挺难的,还不能保证对.想一 ...
- 2016级算法第三次上机-A.Bamboo的小吃街
A Bamboo的小吃街 分析 经典的两条流水线问题,题目描述基本类似于课件中的流水线调度,符合动态规划最优子结构性质 关键的动态规划式子为: dp[0][j] = min(dp[0][j - 1], ...
- 2016级算法第五次上机-G.ModricWang的撒币游戏
1062 ModricWang的撒币游戏 思路 此题为2017年ACM-ICPC亚洲区域赛乌鲁木齐赛区的A题,现场94个队中有38个队做出此题.在这里作为满分以外的题,是为了让大家看一下外面一些题的风 ...
- 2016级算法第五次上机-F.ModricWang的水系法术
1066 ModricWang的水系法术 思路 比较典型的最大流问题,需要注意的是,题目已经暗示(明示)了这里的边是双向的,在建图的时候需要加上反向边的容量值. 解决最大流问题的基本思路就是不断在残量 ...
- 2016级算法第四次上机-B ModricWang的序列问题
1019 ModricWang的序列问题 思路 此题题意非常清晰,给定一个序列,求出最长上升子序列的长度.从数据规模来看,需要\(O(nlogn)\) 的算法. \(O(nlongn)\) 求最长上升 ...
随机推荐
- 由浅到深理解ROS(5)- launch启动文件的理解与编写
ROS提供了一个同时启动节点管理器(master)和多个节点的途径,即使用启动文件(launch file).事实上,在ROS功能包中,启动文件的使用是非常普遍的.任何包含两个或两个以上节点的系统都可 ...
- windows编程之内核对象
学好windows编程,理解内核对象还是至关重要的(●'◡'●).闲话不多说,下面先来了解一下关于内核对象的知识: 内核对象(kernel object):内核对象是用于管理进 ...
- archives of source
"ubuntu 暂时不能解析域名 archive.ubuntu.com"怎么办? root下输入命令:lsb_release -a用来查询Ubuntu版本号 登录网站 http:/ ...
- fitting 方法的异常值过滤
training = pd.DataFrame({'x':[3,6,9,15,300, 20,85]}). 原始数据training_fitting = pd.DataFrame({'x':[4,7 ...
- PHP发红包程序限制红包的大小
我们先来分析下规律. 设定总金额为10元,有N个人随机领取: N=1 第一个 则红包金额=X元: N=2 第二个 为保证第二个红包可以正常发出,第一个红包金额=0.01至9.99之间的某个随机数. 第 ...
- yii2 gridview 新增按钮 动态显示按钮
新增一个按钮 [ 'class' => 'yii\grid\ActionColumn', 'header' => '操作', 'options' => ['width' => ...
- pig(数据流语言和编译器)学习https://www.w3cschool.cn/apache_pig/apache_pig_execution.html
当我们配置了hadoop集群执行的时候 可以通过命令ls进行查看 存储语法 STORE Relation_name INTO ' required_directory_path ' [USING fu ...
- opencv——pcb上找圆mark点(模板匹配)
#include "stdafx.h" #include <cv.h> #include <highgui.h> #include <cxcore.h ...
- Nhibernate 存储过程获取返回值
写在前面:因为项目使用ssh.net所以做着做着要调用存储过程,而且是有返回值的,按照以前的做法直接在参数里指定下就可以获取,但是在nhibernate里调用就有点陌生了,百度一下得出的结果有两种:第 ...
- Wait--常见的等待类型
--==================================================================================--SLEEP_BPOOL_FL ...