传送门

非常有趣的状压DP。(对反正我自己又没想出来)

因为猪的数目非常的少,还是能想到状压DP。之后,因为首先小鸟都是从原点发射的,所以我们只需要两只猪就可以确定一条抛物线。

既然如此,我们就可以枚举每一对猪,计算出来抛物线的解析式,之后,因为有的时候一条抛物线可以砸死不只一只猪,所以我们可以再枚举一遍,如果猪在这条抛物线上我们就把这条抛物线能消灭的猪叠加。一条抛物线能消灭的猪使用一个压缩状态的二进制数来表示。

在DP的时候,我们考虑所有的情况,对于每种情况去枚举每一只没有被消灭的猪,再枚举另一只猪与之配对。有一些猪只能单独消灭,那就把他们单独计算。还有一些猪在被单独消灭的时候情况可能更优,那我们就多进行一步dp即可。每次在dp的时候更新使用按位或,最后的答案就是dp[(1<<n)-1]。

计算抛物线的式子自己推一下就好。看一下代码。

#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<queue>
#define rep(i,a,n) for(int i = a;i <= n;i++)
#define per(i,n,a) for(int i = n;i >= a;i--)
#define enter putchar('\n')using namespace std;
const int M = 1005;
const int N = 1000005;
const int INF = 1e9;
double eps = 1e-7;
typedef long long ll;int read()
{int ans = 0,op = 1;char ch = getchar();while(ch < '0' || ch > '9'){if(ch == '-') op = -1;ch = getchar();}while(ch >= '0' && ch <= '9'){ans *= 10;ans += ch - '0';ch = getchar();}return ans * op;
}int t,n,m,dp[N],st[25][25];
bool pd[M];
double x[M],y[M];
int calc(int p,int q)
{if(x[p] == x[q]) return 0;double a = ((x[q] * y[p] / x[p]) - y[q]) / (x[q] * (x[p] - x[q]));double b = (y[p] - x[p] * x[p] * a) / x[p];
//    printf("%.2lf %.2lf\n",a,b);if(a >= 0) return 0;int res = 0;pd[p] = pd[q] = 1;//可以不单独消灭rep(i,1,n)//寻找其他可以被该小鸟消灭的猪
    {double dx = x[i],dy = y[i];if(fabs(a * dx * dx + b * dx - dy) < eps)res |= 1 << (i-1),dp[res] = 1;}return res;
}int main()
{t = read();while(t--){memset(dp,127/3,sizeof(dp));memset(pd,0,sizeof(pd));memset(st,0,sizeof(st));n = read(),m = read();rep(i,1,n) scanf("%lf%lf",&x[i],&y[i]),dp[1<<(i-1)] = 1;//消灭当前点的小猪需要一只鸟rep(i,1,n)rep(j,1,i-1) st[i][j] = calc(i,j);//计算每条抛物线能打到的猪rep(i,1,(1<<n)-1){rep(j,1,n){if(i & (1<<(j-1))) continue;//这猪已经G了if(!pd[j]) //只能单独消灭
                {dp[i|1<<(j-1)] = min(dp[i|1<<(j-1)],dp[i]+1);continue;}rep(k,1,j-1){if(i & (1<<(k-1))) continue;//这猪G了dp[i|st[j][k]] = min(dp[i|st[j][k]],dp[i] + 1);//更新答案
                }dp[i|1<<(j-1)] = min(dp[i|1<<(j-1)],dp[i] + 1);//单独消灭更好的话在这里更新
            }}printf("%d\n",dp[(1<<n)-1]);输出答案}return 0;
}
/*
1
2 0
1.00 3.00
3.00 3.00
*/

转载于:https://www.cnblogs.com/captain1/p/9607366.html

NOIP2016 愤怒的小鸟相关推荐

  1. [NOIP2016]愤怒的小鸟(状压DP)

    [NOIP2016]愤怒的小鸟(状压DP) 题目描述 输入输出格式 输入格式: 第一行包含一个正整数 T,表示游戏的关卡总数. 下面依次输入这 T个关卡的信息.每个关卡第一行包含两个非负整数 n,m, ...

  2. [NOIP2016]愤怒的小鸟 状态压缩dp

    题目描述 Kiana最近沉迷于一款神奇的游戏无法自拔. 简单来说,这款游戏是在一个平面上进行的. 有一架弹弓位于(0,0)处,每次Kiana可以用它向第一象限发射一只红色的小鸟,小鸟们的飞行轨迹均为形 ...

  3. Noip 2016 愤怒的小鸟 题解

    [NOIP2016]愤怒的小鸟 时间限制:1 s   内存限制:256 MB [题目描述] Kiana最近沉迷于一款神奇的游戏无法自拔. 简单来说,这款游戏是在一个平面上进行的. 有一架弹弓位于(0, ...

  4. linux 6.4定时启动,Centos6.4 设置开机自动以某个非root用户启动脚本

    搭建LAMP环境注意事项 一:安装mysql 5.5以上版本需要使用cmake 和 bison 并且需要安装ncurses 在安装MySQL完毕之后,需要覆盖 掉 /etc/my.cnf centos ...

  5. 清北学堂2019.8.8

    Day 3 赵和旭 状态压缩dp 状态压缩是设计dp状态的一种方式. 当普通的dp状态维数很多(或者说维数与输入数据有关),但每一维总量很少是,可以将多维状态压缩为一维来记录. 这种题目最明显的特征就 ...

  6. [NOIP2016 提高组] 愤怒的小鸟

    [NOIP2016 提高组] 愤怒的小鸟 题意: 有n只猪,给出猪的坐标(xi,yi),问最少用几个形如 y=ax^2+bx 的曲线可以保证所有猪在曲线上,满足a<0,a,b为实数 n<= ...

  7. 【NOIP2016】愤怒的小鸟

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

  8. NOIP2016 D2T3 愤怒的小鸟

    Kiana最近沉迷于一款神奇的游戏无法自拔. 简单来说,这款游戏是在一个平面上进行的. 有一架弹弓位于(0,0)处,每次Kiana可以用它向第一象限发射一只红色的小鸟,小鸟们的飞行轨迹均为形如的曲线, ...

  9. P2831 [NOIP2016 提高组] 愤怒的小鸟 状压dp

    某谷链接 题意:选最少的抛物线来覆盖所有点. 注意到a<0,所以我们可以枚举两个点来构成一条抛物线,让后记这两个点构成的抛物线为 cov[i][j]cov[i][j]cov[i][j],让后他存 ...

最新文章

  1. vtk相机_C#开发PACS医学影像三维重建(一)使用VTK重建3D影像
  2. java 谈设计模式之简单工厂
  3. Codeforces 919D Substring (拓扑图DP)
  4. C++类中不能定义自身类类型成员变量
  5. 使用 TypeScript 改造构建工具及测试用例
  6. 【数据结构与算法】【算法思想】【联系与区别】回溯 贪心 动态规划 分治
  7. 罗永浩直播又翻车?网友吐槽半价车是黑幕,本人回应
  8. 正在利用0day 时被人发现了,然后我灵机一动……
  9. NP、OSPF 缺省路由
  10. php存sqlite图片,SQLite数据库如何存储图片/语音
  11. FTP、TFTP、NFS、SSH介绍及在 Ubuntu 上的安装配置
  12. 【图卷积网络】Graph Convolutional Network
  13. 计算机基础知识教程函数,EXCEL函数教程_电脑基础知识_IT计算机_专业资料.ppt
  14. 全球20大半导体企业无1家入围,中国半导体任重道远
  15. JustinMind
  16. Windows ActiveMq开机自启动设置
  17. 插上移动硬盘计算机没反应,usb硬盘插上电脑没反应怎么办,手把手教你怎么解决...
  18. AutoReleasePool 底层原理
  19. Linux vmstat命令
  20. 让你的桌面起飞吧(OpenSolaris2008.05 VirtualBox WinXP)

热门文章

  1. Python中lambda表达式的优缺点及使用场景
  2. Go语言生成区间随机数
  3. 2015年第六届蓝桥杯 - 省赛 - C/C++大学A组 - C.奇妙的数字
  4. 编程求一个后缀表达式的值
  5. Netty实战 IM即时通讯系统(四)服务端启动流程
  6. 【Android】 Android体系结构图
  7. 计算机要怎么设置才能谈音乐,解读:如何设置要插入计算机的U盘以自动播放歌曲...
  8. openssl漏洞怎么处理_以太坊UDP流量放大反射DDOS漏洞
  9. 友盟小米收不到推送消息_App消息推送的到达率多少才是正常的?
  10. gdb基本命令 与 技巧