洛谷P2831 愤怒的小鸟——贪心?状压DP
题目:https://www.luogu.org/problemnew/show/P2831
一开始想 n^3 贪心来着;
先按 x 排个序,那么第一个不就一定要打了么?
在枚举后面某一个,和它形成一条抛物线,选能顺便打掉最多的那个;
然后连样例都过不了...
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#define eps 1e-9
using namespace std;
int T,n,m,ans;
bool vis[];
struct N{
double x,y;
}p[];
bool cmp(N x,N y){return x.x<y.x;}
int main()
{
scanf("%d",&T);
while(T--)
{
memset(vis,,sizeof vis);
ans=;
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++)
scanf("%lf%lf",&p[i].x,&p[i].y);
sort(p+,p+n+,cmp);
for(int i=;i<=n;i++)
{
if(vis[i])continue; vis[i]=;
// printf("i=%d\n",i);
double x1=p[i].x, y1=p[i].y, xx=x1*x1, x2,y2,xy,a,b,aa=,bb=;
for(int j=i+;j<=n;j++)
{
int cnt=,mx=;
if(vis[j]||p[j].x==p[i].x)continue;
x2=p[j].x; y2=p[j].y; xy=x2*x2;
// y2=y2/x2*x1; xy=xy/x2*x1;
// a=(y1-y2)/(xx-xy);
a=(y1*x2-y2*x1)/(x1*x2*(x1-x2));
b=(y1-a*xx)/x1;
// printf("%lf %lf\n",a,b);
for(int k=j+;k<=n;k++)
{
if(vis[k])continue;
double tx=p[k].x,ty=p[k].y;
if(a*tx*tx+b*tx-ty<eps)cnt++;
}
if(cnt>mx)mx=cnt,aa=a,bb=b;
}
if(aa||bb)
for(int j=i+;j<=n;j++)
if(fabs(aa*p[j].x*p[j].x+bb*p[j].x-p[j].y)<eps)vis[j]=;
ans++;
}
printf("%d\n",ans);
}
return ;
}
囧
仔细想想,贪心可能是错的;
正解是状压DP,DP真是与贪心相对的正确解法啊...
n 很小,所以想到状压,记录所有可能的抛物线的打猪情况;
然后类似背包转移即可...
代码如下:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#define eps 1e-8
using namespace std;
int T,n,m,f[],g[],tot;
double x[],y[];
bool ck(int k,double a,double b)
{
return fabs(a*x[k]*x[k]+b*x[k]-y[k])<eps;
}
int main()
{
scanf("%d",&T);
while(T--)
{
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++)scanf("%lf%lf",&x[i],&y[i]);
memset(g,,sizeof g); double a,b;
for(int i=;i<=n;i++)
for(int j=i+;j<=n;j++)
{
if(x[i]==x[j])continue;
a=(y[i]*x[j]-y[j]*x[i])/(x[i]*x[j]*(x[i]-x[j]));
b=(y[i]-a*x[i]*x[i])/x[i];
if(a>=)continue;//>=而非> !
tot++;
for(int k=;k<=n;k++)
if(ck(k,a,b))g[tot]|=(<<(k-));
}
for(int i=;i<n;i++)g[++tot]|=(<<i);
sort(g+,g+tot+);
tot=unique(g+,g+tot+)-g-;
memset(f,0x3f,sizeof f); f[]=;
for(int i=;i<(<<n);i++)
for(int j=;j<=tot;j++)
f[i|g[j]]=min(f[i|g[j]],f[i]+);
printf("%d\n",f[(<<n)-]);
}
return ;
}
洛谷P2831 愤怒的小鸟——贪心?状压DP的更多相关文章
- 2018.11.02 洛谷P2831 愤怒的小鸟(状压dp)
传送门 状压一眼题. 直接f[i]f[i]f[i]表示未选择状态为iii时的最小次数. 然后考虑现在怎么转移. 显然可以直接枚举消掉某一个点或者某两个点,复杂度O(n22n)O(n^22^n)O(n2 ...
- 洛谷P3959 宝藏(状压dp)
传送门 为什么感觉状压dp都好玄学……FlashHu大佬太强啦…… 设$f_{i,j}$表示当前选的点集为$i$,下一次要加入的点集为$j$时,新加入的点和原有的点之间的最小边权.具体的转移可以枚举$ ...
- 洛谷 P3112 后卫马克 —— 状压DP
题目:https://www.luogu.org/problemnew/show/P3112 状压DP...转移不错. 代码如下: #include<iostream> #include& ...
- 【洛谷4941】War2 状压Dp
简单的状压DP,和NOIP2017 Day2 找宝藏 代码几乎一样.(比那个稍微简单一点) f[i][j] ,i代表点的状态,j是当前选择的点,枚举上一个选到的点k 然后从f[i-(1<< ...
- 洛谷 3959 宝藏——枚举+状压dp
题目:https://www.luogu.org/problemnew/show/P3959 原来写了个不枚举起点的状压dp. #include<iostream> #include< ...
- 洛谷$P3959\ [NOIp2017]$ 宝藏 状压$dp$
正解:状压$dp$ 解题报告: 传送门$QwQ$ $8102$年的时候就想搞这题了,,,$9102$了$gql$终于开始做这题了$kk$ 发现有意义的状态只有当前选的点集和深度,所以设$f_{i,j} ...
- 洛谷 P1433 吃奶酪 状压DP
题目描述 分析 比较简单的状压DP 我们设\(f[i][j]\)为当前的状态为\(i\)且当前所在的位置为\(j\)时走过的最小距离 因为老鼠的坐标为\((0,0)\),所以我们要预处理出\(f[1& ...
- 洛谷P2473奖励关——状压DP
题目:https://www.luogu.org/problemnew/show/P2473 还是对DP套路不熟悉... 像这种前面影响后面,而后面不影响前面的问题就应该考虑倒序递推: 看n只有15那 ...
- P2831 愤怒的小鸟(状压dp)
P2831 愤怒的小鸟 我们先预处理出每个猪两两之间(设为$u,v$)和原点三点确定的抛物线(当两只猪横坐标相等时显然无解) 处理出$u,v$确定的抛物线一共可以经过多少点,记为$lines[u][v ...
随机推荐
- assert.ok()详解
assert.ok(value[, message]) 测试 value 是否为真值.它等同于 assert.equal(!!value, true, message). 如果 value 不是真值, ...
- Python中的列表(4)
1.遍历列表 如果想打印列表中的所有元素,则必须遍历列表. 可以使用for ... in ... 语句来遍历列表中的元素.遍历的意思 words = ['a','b','c','d'] for wor ...
- LeetCode(36)Valid Sudoku
题目 Determine if a Sudoku is valid, according to: Sudoku Puzzles - The Rules. The Sudoku board could ...
- Swift - 修改导航栏“返回”按钮文字,图标
Swift - 修改导航栏“返回”按钮文字,图标 2015-11-27 09:13发布:hangge浏览:4037 项目中常常会使用 UINavigationController 对各个页面进行导 ...
- android开发里跳过的坑——onActivityResult在启动另一个activity的时候马上回调
该问题是由于被启动的activity的launchMode为singleTask模式,该模式下不可以使用onActivityResult,要使用onActivityResult,被启动的activit ...
- segv & mini coredump 调研
1. mini coredump a. segv http://zh.scribd.com/doc/3726406/Crash-N-Burn-Writing-Linux-applica ...
- 【51NOD1806】wangyurzee的树(Prufer编码,容斥原理,组合计数)
题意:有n个点和m条限制,每条限制限制了一个点的度数不能为某个数. 求合法的树的个数模10^9+7 n<=10^6 m<=17 思路:WYZ作业 首先m<=17显然是2^m容斥 枚举 ...
- Linux下keepalived下载安装与配置
一.下载(原文链接:http://www.studyshare.cn/blog-front//software/details/1158/0 ) 网盘下载:https://pan.baidu.com/ ...
- 洛谷 P1608 路径统计
P1608 路径统计 题目描述 “RP餐厅”的员工素质就是不一般,在齐刷刷的算出同一个电话号码之后,就准备让HZH,TZY去送快餐了,他们将自己居住的城市画了一张地图,已知在他们的地图上,有N个地方, ...
- WCF的Binding模型之四:信道工厂(Channel Factory)
由于信道管理器在客户端和服务端所起的不同作用,分为信道监听器和信道工厂.和服务端的信道监听其相比,处于客户端的信道工厂显得简单.从名称就可以看得出来,信道工厂的作用就是单纯的创建用于消息发送的信道.我 ...