洛谷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 ...
随机推荐
- django-3 admin开启后台配置并展示表内容
设置了superuser 之后,可以在run server 后, 通过浏览器访问后台,进行界面配置. 1. python manage.py creatersuperuser 此命令在manage.p ...
- Caused by: java.io.IOException: 您的主机中的软件中止了一个已建立的连接。
异常详情 2017-07-16 10:55:26,218 ERROR [500.jsp] - java.io.IOException: 你的主机中的软件中止了一个已建立的连接. org.apache. ...
- LeetCode(56)Merge Intervals
题目 Given a collection of intervals, merge all overlapping intervals. For example, Given [1,3],[2,6], ...
- npm 发包
前几天封装了公用的locaStorage组件,当然封装后需要发布npm官网,于是摸索了一番终于搞定了,总结下来希望对大家有所帮助 npm安装的package一般支持下面几大类: 本地包 url远程包 ...
- iar修改包含路径的方法
- IntelliJ IDEA配置本地Tomcat方法---亲测有效
https://blog.csdn.net/hello_ljl/article/details/79258165
- hdu 3943 经典数位dp好题
/* 题意:求出p-q的第j个nya数 数位dp,求出p-q的所有nya数的个数很好求,但是询问求出最终那个第j个值时是我不会求了看了下别人的思路 具体就是把p-q的第j个转化成0-q的第low+j个 ...
- [NOIP2004] 提高组 洛谷P1091 合唱队形
题目描述 N位同学站成一排,音乐老师要请其中的(N-K)位同学出列,使得剩下的K位同学排成合唱队形. 合唱队形是指这样的一种队形:设K位同学从左到右依次编号为1,2…,K,他们的身高分别为T1,T2, ...
- 【BZOJ4559】成绩比较(组合计数,容斥原理)
题意: G系共有n位同学,M门必修课.这N位同学的编号为0到N-1的整数,其中B神的编号为0号.这M门必修课编号为0到M- 1的整数.一位同学在必修课上可以获得的分数是1到Ui中的一个整数.如果在每门 ...
- msp430入门学习06
msp430的IO端口的第一功能 msp430入门学习