1018 - Brush (IV)
| Time Limit: 2 second(s) | Memory Limit: 32 MB |
Mubashwir returned home from the contest and got angry after seeing his room dusty. Who likes to see a dusty room after a brain storming programming contest? After checking a bit he found an old toothbrush in his room. Since the dusts are scattered everywhere, he is a bit confused what to do. So, he called Shakib. Shkib said that, 'Use the brush recursively and clean all the dust, I am cleaning my dust in this way!'
So, Mubashwir got a bit confused, because it's just a tooth brush. So, he will move the brush in a straight line and remove all the dust. Assume that the tooth brush only removes the dusts which lie on the line. But since he has a tooth brush so, he can move the brush in any direction. So, he counts a move as driving the tooth brush in a straight line and removing the dusts in the line.
Now he wants to find the maximum number of moves to remove all dusts. You can assume that dusts are defined as 2D points, and if the brush touches a point, it's cleaned. Since he already had a contest, his head is messy. That's why he wants your help.
Input
Input starts with an integer T (≤ 1000), denoting the number of test cases.
Each case starts with a blank line. The next line contains three integers N (1 ≤ N ≤ 16). N means that there are N dust points. Each of the next N lines will contain two integers xi yi denoting the coordinate of a dust unit. You can assume that (-1000 ≤ xi, yi ≤ 1000) and all points are distinct.
Output
For each case print the case number and the minimum number of moves.
Sample Input |
Output for Sample Input |
|
2 3 0 0 1 1 2 2 3 0 0 1 1 2 3 |
Case 1: 1 Case 2: 2 |
1 #include<stdio.h>
2 #include<algorithm>
3 #include<string.h>
4 #include<stdlib.h>
5 #include<queue>
6 #include<iostream>
7 #include<math.h>
8 using namespace std;
9 typedef struct pp
10 {
11 int x;
12 int y;
13 } ss;
14 ss ans[200];
15 int line[20][20];
16 int ck[75550][20];
17 int dp[70000];
18 bool xian(pp a,pp b)
19 {
20 return (a.x*b.y-a.y*b.x)==0?true:false;
21 }
22 int main(void)
23 {
24 int i,j,k;
25 scanf("%d",&k);
26 int c;
27 int n,m;
28 for(i=0; i<(1<<16); i++)
29 {
30 int cc=i;
31 int u=0;
32 int t=1;
33 while(u<16)
34 {
35 if(cc%2==0)
36 {
37 ck[i][t]=u;
38 t++;
39 }
40 cc/=2;
41 u++;
42 }
43 ck[i][0]=t-1;
44 }
45 for(c=1; c<=k; c++)
46 {
47
48 memset(line,0,sizeof(line));
49 fill(dp,dp+65550,100);
50 scanf("%d",&n);
51 int xx;
52 int yy;
53 xx=0;
54 yy=0;
55 for(i=0; i<n; i++)
56 {
57 scanf("%d %d",&ans[i].x,&ans[i].y);
58 if(ans[i].x!=0||ans[i].y!=0)
59 xx=ans[i].x,yy=ans[i].y;
60 }
61 for(i=0; i<n; i++)
62 {
63 for(j=i+1; j<n; j++)
64 {
65 line[i][j]|=(1<<i);
66 line[i][j]|=(1<<j);
67 for(int s=0; s<n; s++)
68 {
69 ss nn;
70 nn.x=ans[i].x-ans[j].x;
71 nn.y=ans[i].y-ans[j].y;
72 ss mm;
73 mm.x=ans[s].x-ans[j].x;
74 mm.y=ans[s].y-ans[j].y;
75 bool ask=xian(nn,mm);
76 if(ask)
77 line[i][j]|=(1<<s);
78 }
79 line[j][i]=line[i][j];
80 }
81 }
82 int ak=(1<<n)-1;
83 dp[0]=0;
84 for(i=0; i<=ak; i++)
85 {
86 int uu=i;
87 int cn=0;
88 cn=ck[i][0];
89 cn-=(16-n);
90 if(n-cn==1)
91 dp[i]=1;
92 if(cn>=2)
93 {
94 int s;
95 for(j=1; j<=1; j++)
96 {
97 for(s=j+1; s<=cn; s++)
98 {
99 int v;
100 int t=line[ck[i][j]][ck[i][s]];
101 int de=i;
102 de|=t;
103 dp[de]=min(dp[de],dp[i]+1);
104 }
105 }
106 }
107 }
108 printf("Case %d: ",c);
109 printf("%d\n",dp[ak]);
110 }
111 return 0;
112 }
1018 - Brush (IV)的更多相关文章
- Lightoj 1018 - Brush (IV)
1018 - Brush (IV) PDF (English) Statistics Forum Time Limit: 2 second(s) Memory Limit: 32 MB Muba ...
- [LightOJ 1018]Brush (IV)[状压DP]
题目链接:http://lightoj.com/volume_showproblem.php? problem=1018 题意分析:平面上有不超过N个点,如今能够随意方向划直线将它们划去,问:最少要划 ...
- Light OJ 1018 - Brush (IV)
题目大意: 一个二维平面上有N个点,一把刷子,刷一次可以把一条线上的所有点都刷掉.问最少刷多少次,可以把全部的点都刷完 状态压缩DP, 用记忆化搜索来写, 需要有个优化不然会超时. ===== ...
- Light oj 1018 - Brush (IV) 状态压缩
题目大意: 给出n个点的坐标,求至少画多少掉直线才能连接所有点. 题目思路:状态压缩 首先经行预处理,求出所有状态下,那些点不在该状态内 以任意两点为端点求出这条直线的状态 枚举所有状态,找出不在当前 ...
- (状压) Brush (IV) (Light OJ 1018)
http://www.lightoj.com/volume_showproblem.php?problem=1018 Mubashwir returned home from the contes ...
- Brush (IV) LightOJ - 1018
题意:平面上有一些点,每刷一次可以把同一条直线上的点都刷光,问最少几次把所有点刷光. 方法: 显然是一个状态压缩dp.ans[S]表示把S集合中点刷掉的最少次数.最开始想到的方法是如果S中只有一个或两 ...
- LightOJ1018 Brush (IV)(状压DP)
题目大概说一个平面有n个灰尘,可以用一把刷子直直刷过去清理直线上的所有灰尘,问最少要刷几下才能清理完所有灰尘. 首先怎么刷其实是可以确定的,或者说直线有哪些是可以确定的,而最多就有C(n,2)条不一样 ...
- lightoj刷题日记
提高自己的实力, 也为了证明, 开始板刷lightoj,每天题量>=1: 题目的类型会在这边说明,具体见分页博客: SUM=54; 1000 Greetings from LightOJ [简单 ...
- dp百题大过关(第一场)
好吧,这名字真是让我想起了某段被某教科书支配的历史.....各种DP题层出不穷,不过终于做完了orz 虽然各种手糊加乱搞,但还是要总结一下. T1 Monkey Banana Problem 这 ...
随机推荐
- 准确率,召回率,F值,ROC,AUC
度量表 1.准确率 (presion) p=TPTP+FP 理解为你预测对的正例数占你预测正例总量的比率,假设实际有90个正例,10个负例,你预测80(75+,5-)个正例,20(15+,5-)个负例 ...
- 内网穿透—使用 frp 实现内外网互通
前言 什么是内网穿透? 内网穿透,又叫 NET 穿透,是计算机用语.用通俗的说法就是你家里的个人电脑,可以直接被外网的人访问.例如你在公司,不通过远程工具,直接也可以访问到家里的电脑(本文章特指 we ...
- Elasticsearch中关于transform的一个问题?
背景:现在有一个业务,派件业务,业务员今天去派件(扫描产生一条派件记录),派件可能会有重复派件的情况,第二天再派送(记录被更新,以最新的派件操作为准).现在需要分业务员按天统计每天的派件数量.es版本 ...
- Linux 参数代换 命令 xargs
xargs 命令也是管道命令中的一员.xargs命令的功能简单来说就是参数代换.那么什么叫做参数代换,这里首先要了解管道的概念.在 linux管道 命令一节中我们详细介绍了管道命令的概念.这里我们只是 ...
- 到底什么是自动化优先思维?与RPA有什么关系?
基于RPA的自动化优先,正在成为广大组织的主流管理思维 到底什么是自动化优先思维?与RPA有什么关系? 如何用RPA简单快速的打造一个自动化优先的组织? 文/王吉伟 在IT运维项目中,组织经常会遇到先 ...
- Flink(八)【Flink的窗口机制】
目录 Flink的窗口机制 1.窗口概述 2.窗口分类 基于时间的窗口 滚动窗口(Tumbling Windows) 滑动窗口(Sliding Windows) 会话窗口(Session Window ...
- API测试最佳实践 - 身份验证
适用等级:高级 1. 概况 身份验证通常被定义为是对某个资源的身份的确认的活动,这里面资源的身份指代的是API的消费者(或者说是调用者).一旦一个用户的身份验证通过了,他将被授权访问那些期待访问的资源 ...
- oracle 外部表查alter日志
--创建文件夹,路径是alter日志的路径 create or replace directory data_dir as '/u01/app/oracle/diag/rdbms/orcl/orcl/ ...
- Servlet(2):通过servletContext对象实现数据共享
一,ServletContext介绍 web容器在启动时,它会为每一个web应用程序都创建一个ServletContext对象,它代表当前web应用 多个Servlet通过ServletContext ...
- 【Linux】【Commands】文件管理工具
文件管理工具:cp, mv, rm cp命令:copy 源文件:目标文件 单源复制:cp [OPTION]... [-T] SOURCE DEST 多源复制:cp [OPTION]... SOURCE ...