Noip2016愤怒的小鸟(状压DP)
题目描述
题意大概就是坐标系上第一象限上有N只猪,每次可以构造一条经过原点且开口向下的抛物线,抛物线可能会经过某一或某些猪,求使所有猪被至少经过一次的抛物线最少数量。
原题中还有一个特殊指令M,对于正解并没有什么卵用,
输入输出
第一行一个数T,表示数据组数
对于每组数据,第一行2个整数N,M,
接下来N行每行2个正实数想x,y表示第i只猪的坐标
对于每组数据,输出一行一个数表示最少的抛物线数量
数据范围
N<=18,T<=30
那么N范围只有18,可以想到状压DP,我们可以发现,2点确定一条抛物线y=ax^x+bx,可以开一个二维数组s[i][j]表示经过i点和j点的抛物线经过的猪的状态,在二进制下1表示经过,0表示没有,这里要注意精度问题,a>0的情况排除。
接下来用F[state]表示达到状态state至少需要多少条抛物线,然后N^2得枚举每一条抛物线,状态转移方程为,
F[state|s[i][j]]=min{f[state]+1},这里有个细节优化很关键,就是第一次找到的猪转移后直接break
因为如果继续转移后面的猪,后面也要射第一个点,所以的转移是多余的,可以省下不少时间
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <cstring>
#define Inf 2139062143
#define N 24
using namespace std;
double x[N], y[N];
int T, n, m, f[1 << 19], s[N][N];
inline bool judge(double i, double j) {
return (fabs(i - j) < 1e-9);
}
inline void work(int i, int j) {
if (i == j) {
s[i][j] = 1 << (i - 1);
return;
}
double a = (y[i] * x[j] - y[j] * x[i]) / (x[i] * x[j] * (x[i] - x[j]));
double b = y[i] / x[i] - (y[i] * x[j] - y[j] * x[i]) / (x[j] * (x[i] - x[j]));
if (a >= 0) return;
int ts = 0;
for (int g = 1; g <= n; ++g) {
double tmp = a * x[g] * x[g] + b * x[g];
if (judge(tmp, y[g])) ts |= (1 << (g - 1));
}
s[i][j] = ts;
}
int main() {
freopen("in.txt", "r", stdin);
scanf("%d", &T);
while (T--) {
memset(f, 127, sizeof(f));
memset(s, 0, sizeof(s));
scanf("%d%d", &n, &m);
for (int i = 1; i <= n; ++i) {
scanf("%lf%lf", &x[i], &y[i]);
}
for (int i = 1; i <= n; ++i)
for (int j = 1; j <= n; ++j)
work(i, j);
f[0] = 0;
for (int i = 0; i < (1 << n) - 1; ++i)
for (int j = 1; j <= n; ++j) {
if (i & (1 << (j - 1))) continue;
for (int k = 1; k <= n; ++k) {
if (i & (1 << (k - 1))) continue;
f[i | s[j][k]] = min(f[i | s[j][k]], f[i] + 1);
}
break;
}
printf("%d\n", f[(1 << n) - 1]);
}
return 0;
}
然后就A了hahaha
Noip2016愤怒的小鸟(状压DP)的更多相关文章
- NOIP2016愤怒的小鸟 [状压dp]
愤怒的小鸟 题目描述 Kiana 最近沉迷于一款神奇的游戏无法自拔. 简单来说,这款游戏是在一个平面上进行的. 有一架弹弓位于 (0,0) 处,每次 Kiana 可以用它向第一象限发射一只红色的小鸟, ...
- luogu2831 [NOIp2016]愤怒的小鸟 (状压dp)
由范围可以想到状压dp 两个点(再加上原点)是可以确定一个抛物线的,除非它们解出来a>=0,在本题中是不合法的 这样的话,我们可以预处理出由任意两个点确定的抛物线所经过的所有的点(要特别规定一下 ...
- [noip2016]愤怒的小鸟<状压dp+暴搜>
题目链接:https://vijos.org/p/2008 现在回过头去看去年的考试题,发现都不是太难,至少每道题都有头绪了... 这道题的数据范围是18,这么小,直接暴力呗,跑个暴搜就完了,时间也就 ...
- [Luogu P2831] 愤怒的小鸟 (状压DP)
题面: 传送门:https://www.luogu.org/problemnew/show/P2831 Solution 首先,我们可以先康一康题目的数据范围:n<=18,应该是状压或者是搜索. ...
- 洛谷P2831 愤怒的小鸟(状压dp)
题意 题目链接 Sol 这题....我样例没过就A了??..算了,就当是样例卡精度吧.. 直接状压dp一下,\(f[sta]\)表示干掉\(sta\)这个集合里面的鸟的最小操作数 转移的时候判断一下一 ...
- NOIP2016Day2T3愤怒的小鸟(状压dp) O(2^n*n^2)再优化
看这范围都知道是状压吧... 题目大意就不说了嘿嘿嘿 网上流传的写法复杂度大都是O(2^n*n^2),这个复杂度虽然官方数据可以过,但是在洛谷上会TLE[百度搜出来前几个博客的代码交上去都TLE了], ...
- 【题解】P2831 愤怒的小鸟 - 状压dp
P2831愤怒的小鸟 题目描述 \(Kiana\) 最近沉迷于一款神奇的游戏无法自拔. 简单来说,这款游戏是在一个平面上进行的. 有一架弹弓位于 \((0,0)\) 处,每次 \(Kiana\) 可以 ...
- P2831 愤怒的小鸟 状压dp
这个题主要是预处理比较复杂,先枚举打每只鸟用的抛物线,然后找是否有一个抛物线经过两只鸟,然后就没了. 题干: 题目描述 Kiana 最近沉迷于一款神奇的游戏无法自拔. 简单来说,这款游戏是在一个平面上 ...
- [NOIP2016]愤怒的小鸟 D2 T3 状压DP
[NOIP2016]愤怒的小鸟 D2 T3 Description Kiana最近沉迷于一款神奇的游戏无法自拔. 简单来说,这款游戏是在一个平面上进行的. 有一架弹弓位于(0,0)处,每次Kiana可 ...
随机推荐
- 201521123068《Java程序设计》第1周学习总结
1. 本周学习总结 Java是各个应用平台的基础,学习了解Java SE以奠定基础: 使用Myeclipse 或者Eclipse 进行编程: Java语言具有平台无关性.面对对象(封装.继承.多态). ...
- Java-Preferences用法-入门
Properties提供的应用程序解决方案主要存在两个问题: (1)配置文件不能放在主目录中,因为某些OS(如Win9X)没有主目录的概念: (2)没有标准的文件命名规则,存在文件名冲突的可能性. J ...
- 201521123007《Java程序设计》第9周学习总结
1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结异常相关内容. 2. 书面作业 本次PTA作业题集异常 1. 常用异常 题目5-1 1.1 截图你的提交结果(出现学号) 1.2 自 ...
- JAVA课程设计-猜数游戏 201521123017
1.团队课程设计博客链接 http://www.cnblogs.com/m1ng123/p/7056740.html 2.个人负责模块或任务说明 (1)文件读取和文件的存储 (2)提示板块的窗口设计 ...
- 201521123020 《Java程序设计》第9周学习总结
1.本周学习总结 2. 书面作业 1.常用异常 题目5-1 1.1 截图你的提交结果(出现学号) 1.2 自己以前编写的代码中经常出现什么异常.需要捕获吗(为什么)?应如何避免? 答:数组越界:不需要 ...
- 201521123024 《Java程序设计》第11周学习总结
1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多线程相关内容. 2. 书面作业 本次PTA作业题集多线程 1.互斥访问与同步访问 完成题集4-4(互斥访问)与4-5(同步访问) ...
- 史上最全CentOS安装教程,图文结合
这是我最近整理的一份最全的CentOS安装步骤,亲自测试步骤,步步都有截图,步骤清晰.按此教程可轻松装机,并且安装成功的主机能访问外部网络. 闲话不说,首先介绍一下本教程用到工具: VMware Wo ...
- Tomcat配置用户名和密码
1.在浏览器输入http://localhost:8080/,打开Tomcat自带的默认主页面,右侧有"administration""documentation&quo ...
- RabbitMQ消息队列之二:消费者和生产者
在使用RabbitMQ之前,需要了解RabbitMQ的工作原理. RabbitMQ的工作原理 RabbitMQ是消息代理.从本质上说,它接受来自生产者的信息,并将它们传递给消费者.在两者之间,它可以根 ...
- Angular2组件与指令的小实践
如果说模块系统是Angular2的灵魂,那其组件体系就是其躯体,在模块的支持下渲染出所有用户直接看得见的东西,一个项目最表层的东西就是组件呈现的视图.而除了直接看的见的躯体之外,一个完整的" ...