传送门

状压一眼题。


直接f[i]f[i]f[i]表示未选择状态为iii时的最小次数。

然后考虑现在怎么转移。

显然可以直接枚举消掉某一个点或者某两个点,复杂度O(n22n)O(n^22^n)O(n22n)

由于这个集合里面的所有点最终都会被消掉,因此顺序并不重要。

于是可以强制这一步会消掉lowbit(i)lowbit(i)lowbit(i)

那么当前有两个选择:

  1. 只消掉lowbit(i)lowbit(i)lowbit(i)
  2. 还会消掉其它的。

第一种直接递归,第二种可以预处理数组f[i][j]f[i][j]f[i][j]表示如果构造一条过了i,ji,ji,j的抛物线并消去上面的点,剩下的点的集合。

然后转移就很轻松了。

代码:

#include<bits/stdc++.h>
using namespace std;
const int N=20;
int T,TT,n,stat[N][N],f[1<<18],bit[19],mp[(1<<18)+1];
bool g[N][N];
struct Node{double x,y;}p[N];
inline bool check(int pos,double a,double b){return fabs(a*p[pos].x*p[pos].x+b*p[pos].x-p[pos].y)>1e-10;}
inline int lowbit(int x){return x&-x;}
inline int countbit(int x){int ret=0;while(x)x-=lowbit(x),++ret;return ret;}
inline int dfs(int sta){
	if(~f[sta])return f[sta];
	if(!sta)return f[sta]=0;
	if(sta==lowbit(sta))return f[sta]=1;
	f[sta]=countbit(sta);
	int i=lowbit(sta),staa=sta-lowbit(sta);
	f[sta]=min(f[sta],1+dfs(sta^i));
	while(staa){
		int j=lowbit(staa);
		if(!g[mp[i]+1][mp[j]+1])f[sta]=min(f[sta],1+dfs(sta&stat[mp[i]+1][mp[j]+1]));
		staa-=j;
	}
	return f[sta];
}
int main(){
	scanf("%d",&T),bit[0]=1,mp[1]=0;
	for(int i=1;i<=18;++i)bit[i]=bit[i-1]<<1,mp[bit[i]]=i;
	while(T--){
		memset(f,-1,sizeof(f)),memset(g,0,sizeof(g)),scanf("%d",&n),scanf("%d",&TT);
		for(int i=1;i<=n;++i)scanf("%lf%lf",&p[i].x,&p[i].y);
		for(int i=1;i<=n;++i)
			for(int j=1;j<=n;++j){
				if(i==j){g[i][j]=1;continue;}
				int sta=0;
				double a1=p[i].x*p[i].x,b1=p[i].x,c1=-p[i].y,a2=p[j].x*p[j].x,b2=p[j].x,c2=-p[j].y;
				double a,b;
				if(fabs(b1-b2*a1/a2)>1e-5)b=-(c1-c2*a1/a2)/(b1-b2*a1/a2),a=(-c1-b1*b)/a1;
				else{g[i][j]=1;continue;}
				if(a>-1e-5){g[i][j]=1;continue;}
				else for(int k=1;k<=n;++k)if(check(k,a,b))sta|=1<<(k-1);
				stat[i][j]=sta;
			}
		printf("%d\n",dfs((1<<n)-1));
	}
	return 0;
}

2018.11.02 洛谷P2831 愤怒的小鸟(状压dp)的更多相关文章

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

    题意 题目链接 Sol 这题....我样例没过就A了??..算了,就当是样例卡精度吧.. 直接状压dp一下,\(f[sta]\)表示干掉\(sta\)这个集合里面的鸟的最小操作数 转移的时候判断一下一 ...

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

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

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

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

  4. 2018.11.02 洛谷P2661 信息传递(拓扑排序+搜索)

    传送门 按照题意模拟就行了. 先拓扑排序去掉不在环上面的点. 剩下的都是简单环了. 于是都dfsdfsdfs一遍求出最短的环就行. 代码: #include<bits/stdc++.h> ...

  5. 2018.11.02 洛谷P2312 解方程(数论)

    传送门 直接做肯定会TLETLETLE. 于是考验乱搞能力的时候到了. 我们随便选几个质数来checkcheckcheck合法解,如果一个数无论怎么checkcheckcheck都是合法的那么就有很大 ...

  6. 2018.11.02 洛谷P3952 时间复杂度(模拟)

    传送门 惊叹考场dubuffdubuffdubuff. 这题还没有梭哈难啊233. 直接按照题意模拟就行了. 代码: #include<bits/stdc++.h> using names ...

  7. 2018.11.04 洛谷P2679 子串(线性dp)

    传送门 为什么前几年的noipnoipnoip总是出这种送分题啊? 这个直接线性dpdpdp不就完了吗? f[i][j][k][0/1]f[i][j][k][0/1]f[i][j][k][0/1]表示 ...

  8. P2831 愤怒的小鸟 状压dp

    这个题主要是预处理比较复杂,先枚举打每只鸟用的抛物线,然后找是否有一个抛物线经过两只鸟,然后就没了. 题干: 题目描述 Kiana 最近沉迷于一款神奇的游戏无法自拔. 简单来说,这款游戏是在一个平面上 ...

  9. 洛谷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 ...

随机推荐

  1. tcp/ip通信第5期之服务器端程序

    /* 此程序是tcp/ip通信服务器端程序,测试运行在redhat5上 重构readline函数,解决粘包问题——利用“\n”识别一个消息边界 */ #include<stdio.h> # ...

  2. MySQL之开启远程连接

    MySQL安装时,默认只能本地连接. mysql -u root -p mysql>use mysql; mysql>select 'host' from user where user= ...

  3. sqlserver还原数据库失败,sql2008备份集中的数据库备份与现有的xxx数据库不同

    正常操作发现报标题错误,百度后解决思路如下(@参考文章)转到选项下面,勾选覆盖现有数据库即可

  4. EasyUI Dialog 对话框 关闭事件

    在  $('#×××').dialog('close');  执行后触发 $(function(){ $("#titledialos").dialog({ onClose: fun ...

  5. tomcat 启动日志乱码

    打开cd到tomcat/conf/目录下 修改logging.properties 找到 java.util.logging.ConsoleHandler.encoding = utf-8这行 更改为 ...

  6. 26-算法训练 Torry的困惑(基本型) 素数打表

      算法训练 Torry的困惑(基本型)   时间限制:1.0s   内存限制:512.0MB      问题描述 Torry从小喜爱数学.一天,老师告诉他,像2.3.5.7……这样的数叫做质数.To ...

  7. vue内引入jsPlumb流程控制器(一)

    1. npm i jsplumb --save 注:jsplumb要全小写 2. 在main.js内 加: import jsPlumb from 'jsplumb' Vue.prototype.$j ...

  8. 通过PropertyDescriptor反映射调用set和get方法

    package com.zhoushun; import java.lang.reflect.Method; import java.lang.reflect.Field; import java.b ...

  9. Excel怎么下拉框多选

    打开Exlce, 确定,然后 右击查看代码,把这段代码复制到新建的文件里面 此时Excel会给出提示,选择否,,系统会提示保存,在保存的时候选择启用宏的工作簿然后保存,此时Excel下拉框多选就搞定了 ...

  10. Linux_(1)基本命令(上)

    一.基本命令1.我是谁 whoami --who am i2.谁在线 who w3.显示当前路径(定位) pwd4.切换目录 cd ~返回主目录 cd ..返回上一级目录5.查看某个目录中的子目录和文 ...