文章目录

  • 题目链接:
  • (一)计算复杂度
  • (二)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相关推荐

  1. 14.图像透视——投影几何性质,平行线(Parallel Lines),消失点(Vanishing Point)_3

    目录 投影几何性质 平行线(Parallel Lines) 消失点(Vanishing Point) 投影几何性质 all right,让我们快速谈谈透视投影的几个几何属性.这个数字试图展示的是一些事 ...

  2. 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 ...

  3. 车道检测--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 ...

  4. AprilTag中的g3d.h和g2d.c文件

    g2d.h文件: /* Copyright (C) 2013-2016, The Regents of The University of Michigan. All rights reserved. ...

  5. hdu1025 Constructing Roads In JGShining#39;s Kingdom(二分+dp)

    转载请注明出处:http://blog.csdn.net/u012860063 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1025 Problem ...

  6. bzoj1007题解

    [题意分析] 给你n个上半平面,求包含这些上半平面的交的上半平面. [解题思路] 按斜率排序,用单调栈维护一个下凸壳即可.复杂度O(nlog2n). [参考代码] 1 #include <cct ...

  7. Homogeneous Coordinates(齐次坐标)

    Problem: Two parallel lines can intersect. 问题: 两条平行线会相交   铁轨在无限远处相交于一点Problem: Two parallel lines ca ...

  8. 磁共振线圈分类_收藏:磁共振检查序列及临床应用总结

    磁共振检查要用到序列,什么是磁共振序列(Sequence)呢?  序列,简单的讲是指具有一定带宽.一定幅度的射频脉冲与梯度脉冲的有机组合.而射频脉冲与梯度脉冲不同的组合方式构成不同的序列,不同的序列获 ...

  9. 微软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% ...

最新文章

  1. ExtAspNet 主题赏析 - 7款 超炫!
  2. LeetCode 284. 顶端迭代器
  3. [导入]Visual Studio 2005 Team Edition软件架构系列课程(1): 概述
  4. SpringCloud中 Feign结合Hystrix断路器开发。
  5. OC typedef(起别名)
  6. 单个用户OWA登陆失败,提示用户名和密码错误
  7. c语言逻辑推理题大全,C语言逻辑推理例题(附答案)
  8. C盘 html后缀 删,磁盘清理c盘的后果是什么?
  9. FusionCompute产品介绍
  10. 信阳师范学院计算机老师,信阳师范学院计算机与信息技术学院导师教师师资介绍简介-郭华平...
  11. JS请求服务器gbk文件乱码问题
  12. Md5码的生成及变种Md5码的生成
  13. E1使用Padavan固件网口做WAN的设置
  14. sketch-code让草图秒变HTML
  15. 《影响力》第七章:稀缺
  16. 异常:谷歌浏览器video标签播放视频不能拖动进度条
  17. go环境搭建开发工具安装配置
  18. termux上的c语言编译器,Termux 与 C 基础
  19. 单向链表的创建与遍历(先进先出和先进后出)
  20. C++用winhttp实现https访问服务器

热门文章

  1. 关于随机森林改进的理解
  2. “玲珑杯”ACM比赛 Round #15 A
  3. FilterDispatcher已被标注为过时解决办法 gt;gt;gt; FilterDispatcher lt;lt;lt; is deprecated!...
  4. go每日新闻--2020-03-10
  5. Windows API--SuspendThread和ResumeThread函数
  6. 自考本科学历是什么 社会认可吗
  7. DM368开发 -- 华为3G/4G模块移植
  8. 五福楼餐馆排班方案优化(线性规划,lingo)
  9. PID控制原理详解(一)
  10. 产生随机数 matlab 分布,matlab产生各种分布的随机数