P2831 愤怒的小鸟

从 \((0, 0)\) 发射一只鸟, 轨迹满足抛物线, 问最少几只鸟可以打完 \(n <= 18\) 只猪


错误日志: 处理抛物线数组没有初始化


Solution

数据范围识状压

挺好想的状压dp

对于每只猪考虑两种情况: 自己被单独打下来或者被其他抛物线经过打下来

现在已经有一个确定点 \((0 ,0)\) 再加一只猪, 两个点无法确定一条抛物线

也就是说这条抛物线是可以给你自己规划的

也也就是说自己被单独打下来一定可行

不过能打多一点会更优

三点确定抛物线

我们暴力枚举两只没被打下来的猪

看还能打几只

更新dp即可

注意两点:

预处理出所有抛物线能打几只猪, 可以省一维枚举每只猪, 不然 \(TLE\)

此题卡精度, 判断两个浮点数是否相等可以确定一个精度 (此题设置为 \(10^{-6}\))

Code

#include<iostream>
#include<cstdio>
#include<queue>
#include<cstring>
#include<algorithm>
#include<climits>
#include<cmath>
#define LL long long
#define REP(i, x, y) for(int i = (x);i <= (y);i++)
using namespace std;
int RD(){
int out = 0,flag = 1;char c = getchar();
while(c < '0' || c >'9'){if(c == '-')flag = -1;c = getchar();}
while(c >= '0' && c <= '9'){out = out * 10 + c - '0';c = getchar();}
return flag * out;
}
const int maxn = (1 << 19);
int T;
int num;
int dp[maxn], one[25];
double a, b;
inline void build(double &a,double &b,double x1,double y1,double x2,double y2){
a=(x2*y1-x1*y2)/(x1*x2*(x1-x2));
b=(x1*x1*y2-x2*x2*y1)/(x1*x2*(x1-x2));
}//计算a,b
bool judge(double x, double y){
double y1 = a * x * x + b * x;
if(fabs(y - y1) <= 1e-6)return 1;
return 0;
}
struct Node{
double x, y;
}I[25];
int van[25][25];
void init(){
memset(van, 0, sizeof(van));
REP(i, 1, num){
REP(j, i + 1, num){
if(fabs(I[i].x - I[j].x) <= 1e-6)continue;
build(a, b, I[i].x, I[i].y, I[j].x, I[j].y);
if(a >= 0)continue;
REP(k, 1, num){
if(judge(I[k].x, I[k].y))van[i][j] |= one[k];
}
}
}
}
int main(){
T = RD();
while(T--){
num = RD(), RD();
REP(i, 1, num)scanf("%lf %lf", &I[i].x, &I[i].y), one[i] = (1 << (i - 1));
int maxstate = (1 << num) - 1;
REP(i, 0, maxstate)dp[i] = 1e9;
init();
dp[0] = 0;
REP(i, 0, maxstate){//状态
REP(j, 1, num){//一只新猪
if(i & one[j])continue;
dp[i | one[j]] = min(dp[i | one[j]], dp[i] + 1);//看看只打一只猪赚不赚
REP(k, j + 1, num){//另一只新猪
if(i & one[k] || !van[j][k])continue;
dp[i | van[j][k]] = min(dp[i | van[j][k]], dp[i] + 1);
}
}
}
printf("%d\n", dp[maxstate]);
}
return 0;
}

P2831 愤怒的小鸟的更多相关文章

  1. P2831 愤怒的小鸟(状压dp)

    P2831 愤怒的小鸟 我们先预处理出每个猪两两之间(设为$u,v$)和原点三点确定的抛物线(当两只猪横坐标相等时显然无解) 处理出$u,v$确定的抛物线一共可以经过多少点,记为$lines[u][v ...

  2. 洛谷P2831 愤怒的小鸟

    洛谷P2831 愤怒的小鸟 原题链接 题解 首先简单数学公式送上. \(ax_1^2+bx_1=y_1\) \(ax_2^2+bx_2=y_2\) \(ax_1^2x_2+bx_1x_2=y_1x_2 ...

  3. 洛谷 P2831 愤怒的小鸟

    P2831 愤怒的小鸟 题目描述 Kiana 最近沉迷于一款神奇的游戏无法自拔. 简单来说,这款游戏是在一个平面上进行的. 有一架弹弓位于 (0,0)(0,0) 处,每次 Kiana 可以用它向第一象 ...

  4. P2831 愤怒的小鸟——状压

    P2831 愤怒的小鸟 抛物线过原点,只要再找两个就能确定抛物线: 处理出两两之间的抛物线能过哪些点,状态压缩: 但是直接枚举每一条抛物线常数太大会T,所以我们需要预处理一个low_bit表示当前状态 ...

  5. Luogu P2831 愤怒的小鸟(状压+记忆化搜索)

    P2831 愤怒的小鸟 题意 题目描述 Kiana最近沉迷于一款神奇的游戏无法自拔. 简单来说,这款游戏是在一个平面上进行的. 有一架弹弓位于\((0,0)\)处,每次Kiana可以用它向第一象限发射 ...

  6. 【题解】P2831 愤怒的小鸟 - 状压dp

    P2831愤怒的小鸟 题目描述 \(Kiana\) 最近沉迷于一款神奇的游戏无法自拔. 简单来说,这款游戏是在一个平面上进行的. 有一架弹弓位于 \((0,0)\) 处,每次 \(Kiana\) 可以 ...

  7. [Luogu P2831] 愤怒的小鸟 (状压DP)

    题面: 传送门:https://www.luogu.org/problemnew/show/P2831 Solution 首先,我们可以先康一康题目的数据范围:n<=18,应该是状压或者是搜索. ...

  8. 洛谷P2831 愤怒的小鸟 + 篮球比赛1 2

    这三道题一起做,有一点心得吧. 愤怒的小鸟,一眼看上去是爆搜,但是实现起来有困难(我打了0分出来). 还有一种解法是状压DP. 抛物线一共只有那么多条,我们枚举抛物线(枚举两个点),这样就能够预处理出 ...

  9. 【luogu P2831 愤怒的小鸟】 题解

    题目链接:https://www.luogu.org/problemnew/show/P2831 写点做题总结:dp,搜索,重在设计状态,状态设的好,转移起来也方便. 对于一条抛物线,三点确定.(0, ...

随机推荐

  1. js为一个对象Object添加一个新的属性和值

    1, var obj = {}; //或者 var obj=new Object(); var key = "name"; var value = "张三丰" ...

  2. 20172329 2018-2019 《Java软件结构与数据结构》实验三报告

    20172329 2018-2019-2 <Java软件结构与数据结构>实验三报告 课程:<Java软件结构与数据结构> 班级: 1723 姓名: 王文彬 学号:2017232 ...

  3. 修改MyEclipse工作空间

    MyEclipse如何更改工作空间,MyEclipse是java开发常用工具,在开发的过程中我们会经常切换工作空间来切换项目内容,初学者来说有必要讲一下如何切换工作空间 工具/原料   MyEclip ...

  4. Shiro异常1:java.lang.IllegalArgumentException: Line argument must contain a key and a value. Only one

    按照开涛shiro的事例 ,老是出这个异常 原因在于ini文件格式错误,为什么我也不知道 我是这样改的:找到其他可以的(换行的时候能右移两下的)在换行处复制粘贴得到那个格式,新建一个ini文件,把刚刚 ...

  5. 【Coursera】高斯混合模型

    一.高斯混合模型 软分类算法,即对每一个样本,计算其属于各个分布的概率,概率值最大的就是这个样本所属的分类. 对于训练样本的分布,看成为多个高斯分布加权得到的.其中每个高斯分布即为某一特定的类. 高斯 ...

  6. 05_Java基础语法_第5天(方法)_讲义

    今日内容介绍 1.方法基础知识 2.方法高级内容 3.方法案例 01方法的概述 * A: 为什么要有方法 * 提高代码的复用性 * B: 什么是方法 * 完成特定功能的代码块. 02方法的定义格式 * ...

  7. Java 经典 书籍

    1.<你的灯还亮着么> 方法论 2.<程序员修炼之道 从小工到专家> 方法论 3.<发布!软件的设计与部署> 案例&经验总结 4.<思考,快与慢> ...

  8. 安装/卸载 修改Config

    参考地址:https://docs.microsoft.com/zh-cn/nuget/create-packages/source-and-config-file-transformations

  9. 如何修改eclipse下注释的颜色

    修改注释颜色:window -- preferences -- java --editor --syntax coloring -- comments 中的前两个就是修改注释颜色的.点击右边的colo ...

  10. MySQL的间隙锁

    什么是间隙锁当我们用范围条件而不是相等条件检索数据,并请求共享或排他锁时,InnoDB会给符合条件的已有数据记录的索引项加锁:对于键值在条件范围内但不存在的记录,叫做“间隙(GAP)”,InnoDB也 ...