Aizu 1379 Parallel Lines
文章目录
- 题目链接:
- (一)计算复杂度
- (二)dfs两重循换变一重
题目链接:
http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=1379
https://vjudge.net/contest/270706#problem/B
题意:给了N个点,问能最多能选出几对直线的斜率相同,斜率可能有多种,点不能重复使用
比赛的时候想把斜率预处理出来,然后枚举能组成这个斜率的直线有多少个
但是后来发现点不能重复使用。。。而这种方法弄出来的点的重复使用了的,所以就不行
然后看题解说直接暴力判断,我还想说暴力力题啊,不做了不做了,但是仔细想想暴力要怎么暴力喃?好像我还不怎么会暴力T_T,还是做一哈算了,结果。。。幸好做了,感觉这道题对我来说其实很有价值~
(一)计算复杂度
首先这个算复杂度的时候我傻逼了,我写了个dfs发现诶怎么符合条件的方案怎么那么多???
N=4:6种
N=6:90种
N=8:2520种
我觉得不应该是这么多啊,N=4的时候都只有3种呀
(1,2)(3,4)
(1,3)(2,4)
(1,4)(2,3)
N=4应该只有这三种
应该是有重复的
然后专门写了个暴力来跑,用的排列来暴力,好像算到12就算不动了T_T
N=4:3种
N=6:15种
N=8:105种
然后用前几项去OEIS查,发现竟然是个双阶乘的数列,双阶乘我还以为是阶乘的阶乘勒,结果要么是偶数的阶乘,要么是奇数的阶乘。
后来我反应过来了,上面N=8的时候有重复的是2520种,无重复的是105种是怎么来的了
每次选两种:
2520 = C 8 2 ⋅ C 6 2 ⋅ C 4 2 ⋅ C 2 2 2520=C_8^2\cdot C_6^2\cdot C_4^2\cdot C_2^2 2520=C82⋅C62⋅C42⋅C22
然后8个点有4对,这4对排列是重复的
因此:
105 = C 8 2 ⋅ C 6 2 ⋅ C 4 2 ⋅ C 2 2 4 ! 105=\frac{C_8^2\cdot C_6^2\cdot C_4^2\cdot C_2^2}{4!} 105=4!C82⋅C62⋅C42⋅C22
然后验证其他的,发现是对的
(二)dfs两重循换变一重
解决了上面的问题我又写了一发,跑最后一个样例的时候发现用了12000ms+
看别人的代码我惊讶地发现为什么别人的dfs里面只有一层循环呀???一次选两个数让我想怎么也要写两个for循环才行呀~
哇,原来别人是这样的:
首先看当前这个数能不能用
①:要是阔以用,那就用for循环再找另一个阔以用的数
②:如果不能用,就直接进入下一层dfs
哇,这样时间上测出来就直接少了4000ms+
最后统计答案那里,我开始是用map统计这种斜率的直线的个数来计算,改成两层for循环直接暴力,速度瞬间变成了1000ms+了,快了8倍左右。。。
#include"bits/stdc++.h"
#define out(x) cout<<#x<<"="<<x
#define C(n,m) (m>n?0:(long long)fac[(n)]*invf[(m)]%MOD*invf[(n)-(m)]%MOD)
using namespace std;
typedef long long LL;
const int maxn=1e2+5;
const int MOD=1e9+7;
int FULL,Max;
int a[maxn],t;
struct Point
{int x,y;Point() {}Point(int x,int y):x(x),y(y) {}
};
Point P[maxn];
pair<int,int>Slope[maxn][maxn];//怕用double炸精度啥的,所以用pair来表示斜率
int N;
int f()
{int res=0;
// map<pair<int,int>,int>Mp;
// for(int i=1; i<N; i+=2)Mp[Slope[a[i]][a[i+1]]]++;
// for(auto i:Mp)
// {// int n=i.second;
// if(n>=2)res+=n*(n-1)/2;
// }//for循环快8倍 for(int i=1; i<=N; i+=2){for(int j=i+2; j<=N; j+=2){int dx=Slope[a[i]][a[i+1]].first;int dy=Slope[a[i]][a[i+1]].second;int tx=Slope[a[j]][a[j+1]].first;int ty=Slope[a[j]][a[j+1]].second;if(dx==tx&&dy==ty)res++;}}return res;
}
int cnt;
void dfs(int STA,int now)
{cnt++;if(STA==FULL){Max=max(Max,f());return ;}if(STA&(1<<now))dfs(STA,now+1);//如果当前这个不能选,直接进入下一个dfselse{for(int i=1; i<=N; i++){if(now==i)continue;if(STA&(1<<i))continue;int sta=STA|(1<<i);sta|=(1<<now);a[++t]=now,a[++t]=i;//同时选now和idfs(sta,now+1);t-=2;}}
}
clock_t t1,t2;
int main()
{while(cin>>N){t=Max=FULL=0;for(int i=1; i<=N; i++){cin>>P[i].x>>P[i].y;FULL|=(1<<i);}for(int i=1; i<=N; i++)//预处理出斜率{for(int j=i+1; j<=N; j++){int x=P[i].x-P[j].x;int y=P[i].y-P[j].y;if(x==0)y=1;else if(y==0)x=1;else{int d=__gcd(x,y);x/=d,y/=d;}Slope[i][j]=Slope[j][i]=make_pair(x,y);}}t1=clock();cnt=0;dfs(0,1);
// cout<<"cnt="<<cnt<<endl;t2=clock();
// cout<<"time="<<t2-t1<<endl;cout<<Max<<endl;}
}/*
16
327 449
-509 761
-553 515
360 948
147 877
-694 468
241 320
463 -753
-206 -991
473 -738
-156 -916
-215 54
-112 -476
-452 780
-18 -335
-146 77
*/
Aizu 1379 Parallel Lines相关推荐
- 14.图像透视——投影几何性质,平行线(Parallel Lines),消失点(Vanishing Point)_3
目录 投影几何性质 平行线(Parallel Lines) 消失点(Vanishing Point) 投影几何性质 all right,让我们快速谈谈透视投影的几个几何属性.这个数字试图展示的是一些事 ...
- Western Subregional of NEERC, Minsk, Wednesday, November 4, 2015 Problem H. Parallel Worlds 计算几何...
Problem H. Parallel Worlds 题目连接: http://opentrains.snarknews.info/~ejudge/team.cgi?SID=c75360ed7f2c7 ...
- 车道检测--VPGNet: Vanishing Point Guided Network for Lane and Road Marking Detection and Recognition
VPGNet: Vanishing Point Guided Network for Lane and Road Marking Detection and Recognition ICCV2017 ...
- AprilTag中的g3d.h和g2d.c文件
g2d.h文件: /* Copyright (C) 2013-2016, The Regents of The University of Michigan. All rights reserved. ...
- hdu1025 Constructing Roads In JGShining#39;s Kingdom(二分+dp)
转载请注明出处:http://blog.csdn.net/u012860063 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1025 Problem ...
- bzoj1007题解
[题意分析] 给你n个上半平面,求包含这些上半平面的交的上半平面. [解题思路] 按斜率排序,用单调栈维护一个下凸壳即可.复杂度O(nlog2n). [参考代码] 1 #include <cct ...
- Homogeneous Coordinates(齐次坐标)
Problem: Two parallel lines can intersect. 问题: 两条平行线会相交 铁轨在无限远处相交于一点Problem: Two parallel lines ca ...
- 磁共振线圈分类_收藏:磁共振检查序列及临床应用总结
磁共振检查要用到序列,什么是磁共振序列(Sequence)呢? 序列,简单的讲是指具有一定带宽.一定幅度的射频脉冲与梯度脉冲的有机组合.而射频脉冲与梯度脉冲不同的组合方式构成不同的序列,不同的序列获 ...
- 微软2013年校园实习生招聘笔试题及答案
原文: http://www.wangkaimin.com/2013/04/07/%e5%be%ae%e8%bd%af2013%e5%b9%b4%e6%a0%a1%e5%9b%ad%e5%ae%9e% ...
最新文章
- ExtAspNet 主题赏析 - 7款 超炫!
- LeetCode 284. 顶端迭代器
- [导入]Visual Studio 2005 Team Edition软件架构系列课程(1): 概述
- SpringCloud中 Feign结合Hystrix断路器开发。
- OC typedef(起别名)
- 单个用户OWA登陆失败,提示用户名和密码错误
- c语言逻辑推理题大全,C语言逻辑推理例题(附答案)
- C盘 html后缀 删,磁盘清理c盘的后果是什么?
- FusionCompute产品介绍
- 信阳师范学院计算机老师,信阳师范学院计算机与信息技术学院导师教师师资介绍简介-郭华平...
- JS请求服务器gbk文件乱码问题
- Md5码的生成及变种Md5码的生成
- E1使用Padavan固件网口做WAN的设置
- sketch-code让草图秒变HTML
- 《影响力》第七章:稀缺
- 异常:谷歌浏览器video标签播放视频不能拖动进度条
- go环境搭建开发工具安装配置
- termux上的c语言编译器,Termux 与 C 基础
- 单向链表的创建与遍历(先进先出和先进后出)
- C++用winhttp实现https访问服务器
热门文章
- 关于随机森林改进的理解
- “玲珑杯”ACM比赛 Round #15 A
- FilterDispatcher已被标注为过时解决办法 gt;gt;gt; FilterDispatcher lt;lt;lt; is deprecated!...
- go每日新闻--2020-03-10
- Windows API--SuspendThread和ResumeThread函数
- 自考本科学历是什么 社会认可吗
- DM368开发 -- 华为3G/4G模块移植
- 五福楼餐馆排班方案优化(线性规划,lingo)
- PID控制原理详解(一)
- 产生随机数 matlab 分布,matlab产生各种分布的随机数