[NOIp 2016]愤怒的小鸟

摘要:
60分算法:1.如果使用暴力,我们会删除一些线段并进入下一个状态。一种状态是指当前平面中还剩多少点;2.注意:无论您如何从当前状态删除点,从上一状态到当前状态的决策都不会受到影响。:)21使用namespacestd;22constdoubleex=1e-8;23intst[20]={1};2425英寸,m;26doublex[20],y[20];27intc[20][20];28intf[+5];2930voidwork(){31scanf;32,33 scanf;34memset;35,36用于{37 doublea=/;38 if continue;39 doubleb=/x1;40用于41 if 42 c[i][j]+=st[k];43}44memset;45f[0]=0;46intlim=-1;47intINF=f[1];48代表49如果(f[i]!=INF)50代表51如果(!){52 f[i|st[j]]=最小值;对于{54 inttmp=i|c[j][k]为53;55 f[tmp]=最小;56}57}58 printf;59}6061itmin(){62for63st[i]=st[i-1]˂˂1;64intt;65scanf;66while(t--)67 work();68return0;69}

Description

这里写图片描述

Input

[NOIp 2016]愤怒的小鸟第2张

[NOIp 2016]愤怒的小鸟第3张

Output

[NOIp 2016]愤怒的小鸟第4张

Sample Input

2
2 0
1.00 3.00
3.00 3.00
5 2
1.00 5.00
2.00 8.00
3.00 9.00
4.00 8.00
5.00 5.00

Sample Output

1
1

Sample Explanation

[NOIp 2016]愤怒的小鸟第5张

HINT

这里写图片描述

题解

暴力做法:

1、因为三点可以确定一条抛物线,又必过原点,那么只需要再找两个点就能确定一条抛物线;

2、枚举点对,求出抛物线方程,注意两点的$x$坐标不能相等,抛物线的二次项系数必须小于$0$;

3、删掉在抛物线上的点,进入下一层继续枚举。

60分算法:

1、如果使用暴力,我们会删掉一些线段进入下一个状态,一个状态是指现在平面内还剩多少个点;

2、注意到一点:从当前状态无论以什么方式删点,均不会影响之前状态到当前状态的决策。也就是说:在之前的状态时,我们只需要考虑,怎样删点来到达当前状态即可,而不用管当前状态下如何删点来到达下一个状态;

3、这具备明显的无后效性,我们用一个二进制数$S$来表示一个状态,若$S$的第$i$位为$1$,则表示第$(i+1)$个点还存在于平面内,那么状态压缩的$DP$可以解决;

4、同样对于每个状态枚举抛物线即可。

100分算法:

1、平面内有$n$个点,共$2^n$个状态,每次枚举抛物线还要检查每个点,需要$O(n^3)$复杂度;

2、每次都要枚举抛物线经过的两个点,即抛物线必定会删去的两个点。既然我们的最终目标是将当前状态所有的点都删去,那么可以知道,删掉所有点的最优方案中,一定会有一条抛物线经过当前状态的第一个点(否则就没法删掉它了);

3、那么我们只需要枚举经过当前状态第一个点的抛物线就可以(这么做一定不会有错误的决策)。

 1 #include <set>
 2 #include <map>
 3 #include <ctime>
 4 #include <cmath>
 5 #include <queue>
 6 #include <stack>
 7 #include <vector>
 8 #include <cstdio>
 9 #include <string>
10 #include <cstring>
11 #include <cstdlib>
12 #include <iostream>
13 #include <algorithm>
14 #define x1 x[i]
15 #define x2 x[j]
16 #define y1 y[i]
17 #define y2 y[j]
18 #define LL long long
19 #define Max(a, b) ((a) > (b) ? (a) : (b))
20 #define Min(a, b) ((a) < (b) ? (a) : (b))
21 using namespace std;
22 const double ex=1e-8;
23 int st[20] = {1};
24 
25 int n, m;
26 double x[20], y[20];
27 int c[20][20];
28 int f[(1<<18)+5];
29 
30 void work(){
31     scanf("%d%d", &n, &m);
32     for (int i = 0; i < n; i++)
33       scanf("%lf%lf", &x[i], &y[i]);
34     memset(c, 0, sizeof(c));
35     for (int i = 0; i < n; i++)
36       for (int j = i+1; j < n; j++){
37           double a = (x1*y2-y1*x2)/(x1*x2*x2-x1*x1*x2);
38           if (a >= 0) continue;
39           double b = (y1-a*x1*x1)/x1;
40           for (int k = 0; k < n; k++)
41             if (abs(y[k]-a*x[k]*x[k]-b*x[k]) <= ex)
42                 c[i][j]+=st[k];
43     }
44     memset(f, 127, sizeof(f));
45     f[0]=0;
46     int lim = (1<<n)-1;
47     int INF = f[1];
48     for (int i = 0; i <= lim; i++)
49       if (f[i] != INF)
50           for (int j = 0; j < n; j++)
51             if (!(i&st[j])){
52                 f[i|st[j]] = Min(f[i|st[j]], f[i]+1);
53                 for (int k = j+1; k < n; k++){
54                   int tmp = i|c[j][k];
55                   f[tmp] = Min(f[tmp], f[i]+1);
56                 }
57             }
58     printf("%d
", f[lim]);
59 }
60 
61 int main(){
62     for (int i = 1; i <= 18; i++)
63     st[i] = st[i-1]<<1;
64     int t;
65     scanf("%d", &t);
66     while (t--)
67       work();
68     return 0;
69 }

免责声明:文章转载自《[NOIp 2016]愤怒的小鸟》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇十个让你成为优秀程序员的有效方法feel like用法下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

随便看看

vsCode mongoDB插件 Azure Cosmos DB

安装完成后,要重启下vsCode会看到然后点击绿色的小按钮,选择MongoDB再输入MongoDB的连接地址。当然要先把本地的mongoDB数据库打开,cmd黑窗口输入mongod--dbpathxxxx打开本地数据库输入完成地址后,回车就可以连接到自己的MongoDB数据库了...

JAVA 实现CLOB转String

CLOB定义了用于在数据库中保存文件的类型。SQLCLOB是一种内置类型,它将一个大型字符对象作为列值存储在数据库表的一行中。默认情况下,驱动程序使用SQLlocator实现Clob对象,这意味着Clob对象包含指向SQLCLOB数据的逻辑指针,而不是数据本身。Clob对象在其创建的事务期间有效。在一些数据库系统中,文本也用作CLOB的别名。例如,SQL S...

高斯键盘设置指南

高斯键盘设置指南如何打开蓝牙模式电源:蓝牙需要电源。高斯GS87-D有两种通电方式:将键盘背面的开关转到on;使用USBType-C电源切换模式:Fn+P用于在有线模式和无线模式之间切换。按下Fn+P,Fn+PP右上角的键盘灯闪烁3次。有线模式和蓝牙模式相互切换。但是,没有指示灯指示当前模式是有线模式还是蓝牙模式如何连接蓝牙代码匹配:长按Fn+P,直到P键快...

vscode 用户设置与工作区设置

用户设置与工作空间设置VSCode提供了两种设置方式:-用户设置:这种方式进行的设置,会应用于该用户打开的所有工程;-工作空间设置:工作空间是指使用VSCode打开的某个文件夹,在该文件夹下会创建一个名为.vscode的隐藏文件夹,里面包含着仅适用于当前目录的VSCode的设置,工作空间的设置会覆盖用户的设置。更改默认用户设置与工作空间设置VSCode的设置...

面试了一个 31岁的iOS开发者,思绪万千,30岁以上的程序员还有哪些出路?

前言之前HR给了我一份简历,刚看到简历的第一眼,31岁?31岁,iOS开发工程师,工作经历7年,5年左右都在外包公司,2年左右在创业公司。iOS开发工程师这块,还是很少遇到30岁以上的开发,正好,来了一个30岁的开发,说实话,对我来说,还是蛮期待的,希望对我有所启示。这样的过程持续了半个小时那么年过350岁的程序员还有出路吗?作为一个8年的iOS开发,而且几...

十四、ES开启密码认证

所以我们需要为es head和kibana添加密码认证。4、 为kibana设置密码。1.为kibana配置证书。因为kibana和es之间的连接也需要证书加密通信。mkdir-p/etc/kibana/certscp/etc/selastic search/certs-*/etc/kibana/certs/2.授予kibana主要权限。权限必须为kiban...