【a401】直线的交点数
Time Limit: 1 second
Memory Limit: 32 MB
【问题描述】
平面上有n条直线,且无三线共点,问这些直线能有多少种不同的交点数。
【输入格式】
n(n≤20)
【输出格式】
若干行,列出所有相交方案,其中每一行为一个可能的交点数。
【输入样例】
4
【输出样例】
0
3
4
5
6
(表示4条直线的情况下,可能有0、3、4、5、6个交点)
【题目链接】:http://noi.qz5z.com/viewtask.asp?id=a401
【题解】
1条直线的话交点为0;
2条直线交点为1或0;
3条直线的话交点为0,2,3;
4条直线:
①4条直线都平行,交点数为0
②3条直线平行,剩下一条和这3条都相交,交点数为3;
④2条直线平行,则剩下两条直线和这两条平行直线都有交点2*2=4;但是剩下的这两条直线情况未知,是相交还是平行?可以注意到这时又转换成2条直线的问题了;即交点数为2*2+f(2);其中f(x)表示x条直线能够产生多少个交点;
⑤3条直线平行,则剩下一条直线和这3条直线都有交点1*3=3;剩下一条直线;则可以写成1*3+f(1);
综上我们枚举n条直线有j条平行线,则答案就为(n-j)*j+f(n-j);
设bo[x][y]表示x条直线y个交点的情况是否存在
bo[1..n][0]=true
rep1(i,2,n)//枚举有几条直线
rep1(j,1,i)//枚举它有几条平行线;
{
int a = j,b = i-j;//b为未知直线
rep1(k,0,MAXN2-1)//我们相当于在枚举f(i-j)的可能值
if (bo[b][k])//如果i-j条直线可能有k个交点
bo[i][k+b*a] = true;//a*b是平行线和未知直线的交点(肯定是有这些交点的)而k是i-j条线自己内部的交点;
}
【完整代码】
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <set>
#include <map>
#include <iostream>
#include <algorithm>
#include <cstring>
#include <queue>
#include <vector>
#include <stack>
#include <string>
using namespace std;
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define LL long long
#define rep1(i,a,b) for (int i = a;i <= b;i++)
#define rep2(i,a,b) for (int i = a;i >= b;i--)
#define mp make_pair
#define pb push_back
#define fi first
#define se second
typedef pair<int,int> pii;
typedef pair<LL,LL> pll;
void rel(LL &r)
{
r = 0;
char t = getchar();
while (!isdigit(t) && t!='-') t = getchar();
LL sign = 1;
if (t == '-')sign = -1;
while (!isdigit(t)) t = getchar();
while (isdigit(t)) r = r * 10 + t - '0', t = getchar();
r = r*sign;
}
void rei(int &r)
{
r = 0;
char t = getchar();
while (!isdigit(t)&&t!='-') t = getchar();
int sign = 1;
if (t == '-')sign = -1;
while (!isdigit(t)) t = getchar();
while (isdigit(t)) r = r * 10 + t - '0', t = getchar();
r = r*sign;
}
const int MAXN = 25;
const int MAXN2 = 200+10;
const int dx[9] = {0,1,-1,0,0,-1,-1,1,1};
const int dy[9] = {0,0,0,-1,1,-1,1,-1,1};
const double pi = acos(-1.0);
int n;
bool bo[MAXN][MAXN2];
bool flag[MAXN];
int main()
{
//freopen("F:\\rush.txt","r",stdin);
memset(bo,false,sizeof(bo));
rei(n);
rep1(i,0,n)
bo[i][0] = true;
rep1(i,2,n)
rep1(j,1,i)
{
int a = j,b = i-j;
rep1(k,0,MAXN2-1)
if (bo[b][k])
bo[i][k+b*a] = true;
}
rep1(i,0,MAXN2-1)
if (bo[n][i])
printf("%d\n",i);
return 0;
}
【a401】直线的交点数的更多相关文章
- HDU-1466 计算直线的交点数 经典dp
1.HDU-1466 计算直线的交点数 2.链接:http://acm.hdu.edu.cn/showproblem.php?pid=1466 3.总结:不会推这个,看了题解.. 状态转移: m条 ...
- hdu----(1466)计算直线的交点数(dp)
计算直线的交点数 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Su ...
- HDOJ 1466 计算直线的交点数
将n 条直线排成一个序列,直线2和直线1最多只有一个交点,直线3和直线1,2最多有两个交点,......,直线n 和其他n-1条直线最多有n-1个交点.由此得出n条直线互不平行且无三线共点的最多交点数 ...
- 计算直线的交点数(set + 打表)
计算直线的交点数 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total S ...
- C++ 计算直线的交点数(动态规划)
问题链接:http://acm.hdu.edu.cn/showproblem.php?pid=1466 Problem Description 平面上有n条直线,且无三线共点,问这些直线能有多少种不同 ...
- hdu1466计算直线的交点数 非原创
原文链接 平面上有n条直线,且无三线共点,问这些直线能有多少种不同交点数. 比如,如果n=2,则可能的交点数量为0(平行)或者1(不平行). Input输入数据包含多个测试实例,每个测试实例占一行,每 ...
- G题 hdu 1466 计算直线的交点数
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1466 计算直线的交点数 Time Limit: 2000/1000 MS (Java/Others) ...
- 计算直线的交点数(hdu1466简单的dp)
题意:平面上有n条直线,且无三线共点,问这些直线能有多少种不同交点数.比如,如果n=2,则可能的交点数量为0(平行)或者1(不平行). 思路:动态规划,想办法记忆化搜索,当前状态和之前状态结合起来 d ...
- hdu1466 计算直线的交点数
题意: 平面上有n条直线,且无三线共点,问这些直线能有多少种不同交点数. 比如,如果n=2,则可能的交点数量为0(平行)或者1(不平行). 分析: DP 设状态:f[i][j]表示i条直线能否产生j个 ...
随机推荐
- 下拉列表,点击选择实现跳转链接 onchange="window.location=..."
<select onchange="window.location=this.value;"> <option value="a.html"& ...
- LeetCode Algorithm 05_Longest Palindromic Substring
Given a string S, find the longest palindromic substring in S. You may assume that the maximum lengt ...
- UVA 11646 - Athletics Track || UVA 11817 - Tunnelling the Earth 几何
题目大意: 两题几何水题. 1.UVA 11646 - Athletics Track 如图,体育场的跑道一圈400米,其中弯道是两段半径相同的圆弧,已知矩形的长宽比例为a:b,求长和宽的具体数值. ...
- 使用maven进行测试设置断点调试的方法
在Maven中配置测试插件surefire来进行单元测试,默认情况下,surefire会执行文件名以Test开头或结尾的测试用例,或者是以TestCase结尾的测试用例. ...
- C语言编程程序的内存怎样布局
在c语言中,每一个变量和函数有两个属性:数据类型和数据的存储类别. C语言中局部变量和全局变量变量的存储类别(static,extern,auto,register) 1. 从变量的作用域划分变量(即 ...
- Vim常用匹配、查找、替换命令总结
以前都是从头开始找,最近处理log文件很多. 在vim 中输入 :1?XXXX 1的意思是文件的第一行 ?的意思是反向查找 XXXX就是你要找的关键字 更新:Linux 从末尾开始查找日志 tac c ...
- 解决Centos7 下 root账号 远程连接FTP,vsftpd 提示 530 Login incorrect 问题
原文:解决Centos7 下 root账号 远程连接FTP,vsftpd 提示 530 Login incorrect 问题 三步走: 1.vim /etc/vsftpd/user_list 注释掉 ...
- 【19.46%】【codeforces 551B】ZgukistringZ
time limit per test2 seconds memory limit per test256 megabytes inputstandard input outputstandard o ...
- 在Eclipse上打包并使用Proguard工具混淆jar包
近期由于工作须要,学习到了Android jar包的打包与混淆. 之前觉得还是非常easy的,可是自己深入研究下,发现还是有一些东西须要注意的,并且自己也踩了一些坑,在这里写下供同僚们借鉴借鉴. 转载 ...
- C/C++ 变量的初始化
局部变量,初始化为垃圾值,局部静态变量初始化为 0: 1. 二维数组 // 作为局部变量 int arr[4]; // 全是垃圾值 int arr[4] = {1}; // 第一个元素为 1,其他默认 ...