URAL 2036 Intersect Until You're Sick of It 形成点的个数 next_permutation()函数
Time Limit:500MS Memory Limit:65536KB 64bit IO Format:%I64d & %I64u
Description
- Draw a line through every pair of different points.
- Find all intersections of all pairs of different non-parallel lines.
- Merge the initial set of points with the set of intersection points and go to step one.
Input
Output
Sample Input
| input | output |
|---|---|
4 |
题意:给你n个不同的点,第一步,将任意两个点之间连成一条直线,第二步,直线相交可以形成新的点,然后再重复第一步,
问最后可以形成多少个点,如果无穷多个输出oo;
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <vector>
#include <queue>
#include <cstring>
#include <cstring>
#include <algorithm>
using namespace std;
typedef long long ll;
typedef unsigned long long ull; #define MM(a,b) memset(a,b,sizeof(a));
#define inf 0x7f7f7f7f
#define FOR(i,n) for(int i=1;i<=n;i++)
#define CT continue;
#define PF printf
#define SC scanf const int mod=1000000007;
const int N=1e5+10; struct Point{
ll x,y;
void read(){
scanf("%lld%lld",&x,&y);}
bool operator<(const Point &a) const{
if(this->x!=a.x) return this->x<a.x;
else return this->y<a.y;
}
}p[N]; Point operator-(Point a,Point b)
{
return (Point){a.x-b.x,a.y-b.y};
} ll det(Point a,Point b)
{
return a.x*b.y-b.x*a.y;
} int main()
{
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++) p[i].read();
if(n<=3) {printf("%d\n",n);return 0;}
sort(p+1,p+n+1);
if(n==4)
{
do
{
if(det(p[2]-p[1],p[4]-p[3])==0&&det(p[1]-p[4],p[2]-p[3])==0
&&det(p[3]-p[1],p[2]-p[1])!=0)
{printf("5\n");return 0;};
}while(next_permutation(p+1,p+n+1));
}
if(n==5)
{
do
{
if(det(p[2]-p[1],p[4]-p[3])==0&&det(p[1]-p[4],p[2]-p[3])==0&&
det(p[3]-p[1],p[2]-p[1])!=0&&det(p[4]-p[5],p[2]-p[5])==0&&
det(p[3]-p[5],p[1]-p[5])==0)
{printf("5\n");return 0;};
}while(next_permutation(p+1,p+n+1));
} for(int i=1;i<=2;i++)
for(int j=i+1;j<=4;j++)
{
int cnt=2;
for(int k=1;k<=n;k++) if(k!=i&&k!=j)
if(det(p[k]-p[i],p[k]-p[j])==0) cnt++;
if(cnt>=n-1) {printf("%d\n",n);return 0;}
}
printf("oo\n");
return 0;
}
比赛分析:比赛时看到计算几何的题都不敢想,,,,比赛完了后稍微看了下题解,自己再想了想,发现水的一笔;
分析:看到题目时被吓到了,觉得情况好多,,心态很重要!
假设<=3个点,那么自己无论怎么排列,都不会形成新的点,所以就输出n;
如果是4个点,如果是平行四边形,,那么只能形成5个点;
如果是五个点,如果在是平行四边形的基础上,第五个点位于平行四边形的对角线上,那么最后也是五个点。
最后一个是比较特殊的情况,有n个点,假如n-1个点共线,一个点在直线外,那么答案就是n,但是
如果在直线外的点的个数>=2的话,那么就是oo了。
最后,因为要求点的全排列,需要用到next_permutation()函数:
1.因为point是自定义结构体,所以要定义点的优先级
2.next_permutation()函数使用前需要先对待排列数组排下序,利用sort从小到大排序
URAL 2036 Intersect Until You're Sick of It 形成点的个数 next_permutation()函数的更多相关文章
- Ural 2036. Intersect Until You're Sick of It 计算几何
2036. Intersect Until You're Sick of It 题目连接: http://acm.timus.ru/problem.aspx?space=1&num=2036 ...
- [转]数位dp小记
转载自:http://blog.csdn.net/guognib/article/details/25472879 参考: http://www.cnblogs.com/jffifa/archive/ ...
- Array 数组的排序 sort
JavaScript实现多维数组.对象数组排序,其实用的就是原生的sort()方法,用于对数组的元素进行排序.sort() 方法用于对数组的元素进行排序.语法如下:arrayObject.sort(s ...
- T-SQL基础(四)之集合运算
三个运算符 T-SQL支持三个集合运算符:UNION.INTERSECT.EXCEPT. 集合运算符查询的一般形式如下: Query1 <set_operator> Query2 -- 这 ...
- R语言函数总结(转)
R语言特征 对大小写敏感 通常,数字,字母,. 和 _都是允许的(在一些国家还包括重音字母).不过,一个命名必须以 . 或者字母开头,并且如果以 . 开头,第二个字符不允许是数字. 基本命令要么是表达 ...
- Ts基础
//typeof 用来判断变量类型 var s: string = 'egret'; var isString: boolean = typeof s === 'string'; console.lo ...
- 【Ray Tracing in One Weekend 超详解】 光线追踪1-4
我们上一篇写了Chapter5 的第一个部分表面法线,那么我们来学剩下的部分,以及Chapter6. Chapter5:Surface normals and multiple objects. 我们 ...
- [JS深入学习]——数组对象排序
(转) JavaScript实现多维数组.对象数组排序,其实用的就是原生的sort()方法,用于对数组的元素进行排序. sort() 方法用于对数组的元素进行排序.语法如下: arrayObject. ...
- 【R笔记】R语言函数总结
R语言与数据挖掘:公式:数据:方法 R语言特征 对大小写敏感 通常,数字,字母,. 和 _都是允许的(在一些国家还包括重音字母).不过,一个命名必须以 . 或者字母开头,并且如果以 . 开头,第二个字 ...
随机推荐
- Vue 实例之事件 操作样式 (文本、事件、属性、表单、条件)指令
Vue 可以独立完成前后端分离式web项目的JavaScript框架 三大主流框架之一: Angular React Vue 先进的前端设计模式:MVVM 可以完全脱离服务器端,以前端代码复用的方式渲 ...
- socket传送文件格式的问题
在python3中socket传送文件只能传送‘bytes'类型,如下例子: import socket client = socket.socket()client.connect(("l ...
- python爬虫实战--抖音
申明&警告: 请在相关网站的许可范围内爬取数据.以免影响网站正常运行, 如果我的文章有触犯权益的地方, 请告知删除. 上一篇爬取知乎的文章基本就是大多数网站的爬取思路了(headers部分其实 ...
- word、ppt转换为pdf
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...
- python 获取当前目录下的文件目录和文件名
python 获取当前目录下的文件目录和文件名 os模块下有两个函数: os.walk() os.listdir() 1 # -*- coding: utf-8 -*- 2 3 import os ...
- C99 inline关键字
C99 inline 一直以来都用C++用得比较多,这个学期做操作系统的课设用回了C,结果一波內联函数居然链接不过去--查了查资料,C99引入的inline和C++的inline语义区别是很大的,我算 ...
- 转:git上传本地项目到github
转自:https://blog.csdn.net/Lucky_LXG/article/details/77849212 将本地项目上传到Github(两种简单.方便的方法) 一.第一种方法:首先你需要 ...
- 红队基础设施建设:隐藏你的C2
0x01 前言 待定
- Python—selenium模块(浏览器自动化工具)
selenium可以用来完成浏览器自动化相关的操作,写一些代码制定一些基于浏览器自动化的相关操作(行为动作),当代码执行后,浏览器就会自动触发相关的事件 安装方法: pip install selen ...
- Linux编译安装GCC
1. 下载gcc安装包 网址:http://ftp.gnu.org/gnu/gcc/ ,下载对应的安装包,我选择gcc-5.5.0.tar.gz 2. 下载依赖库 一个是mpc,一个是gmp,一个是m ...