题目传送门

没啥别的想法,感觉就是搜索,经过原点的抛物线已知两个点就可以求出解析式,在还没有被打下来的两个猪之间随意配对,确定解析式之后标记在这个抛物线下被打下来的猪。

猪也可以单独用一个抛物线打下来。

和之前写斗地主的搜索模式差不多,$TLE60pts$

就是要注意一下精度问题,$get$一个新点:浮点数的判等不能用$==$,可能会有精度误差,只差一点点的情况下可以认为他们是相等的,精度大概就取$EPS=1e-8$

bool dy(double a,double b)
{//浮点误差
return Abs(a-b)<EPS;
}
 //暴搜 60pts
#include<cstdio>
#include<algorithm>
#include<vector>
#include<cstring>
#include<queue>
#include<map>
#include<iostream>
using namespace std;
#define ll long long
#define INF 0x3f3f3f3f
#define N 20
#define EPS 1e-8
double Abs(double a)
{
if(a>=0.0) return a;
return -a;
}
bool dy(double a,double b)
{//浮点误差
return Abs(a-b)<EPS;
}
int rd()
{
int f=,s=;char c=getchar();
while(c<''||c>''){if(c=='-') f=-;c=getchar();}
while(c>=''&&c<=''){s=(s<<)+(s<<)+(c^);c=getchar();}
return f*s;
}
int n,m,ans;
struct node{
double x,y;
}pt[N];
bool vis[N];
int tmp[N],cnt;
void dfs(int k)//发射小鸟的次数
{
if(k>ans) return ;
for(int i=;i<=n;i++)
{
if(vis[i]) continue;
vis[i]=;
for(int j=i+;j<=n;j++)
{
if(vis[j]) continue;
double x1=pt[i].x,x2=pt[j].x,y1=pt[i].y,y2=pt[j].y;
double a=(y1*x2-y2*x1)/(x1*x2*x1-x1*x2*x2);
if(a>=) continue;//vis[j]=1要放在这个后面 否则不构成继续递归的条件也还是标记了
double b=(y1*x2*x2-y2*x1*x1)/(x1*x2*x2-x1*x1*x2);
//queue<int>Q;
//while(!Q.empty()) Q.pop();
cnt=;
vis[j]=;
for(int p=;p<=n;p++)
if(dy(pt[p].x*pt[p].x*a+pt[p].x*b,pt[p].y))
{
vis[p]=;
tmp[++cnt]=p;
//Q.push(p);
}
dfs(k+);
vis[j]=;
for(int i=;i<=cnt;i++)
vis[tmp[i]]=;
cnt=;
/*while(!Q.empty())
{
int u=Q.front();Q.pop();
vis[u]=0;
}*/
}
vis[i]=;
}
for(int i=;i<=n;i++)
if(!vis[i]) k++;
ans=min(ans,k);
return ;
}
int main()
{
int T=rd();
while(T--)
{
n=rd(),m=rd();
for(int i=;i<=n;i++)
scanf("%lf %lf",&pt[i].x,&pt[i].y),vis[i]=;
if(n==)
{
puts("");
continue;
}
if(n==)
{
/*
x1*x1*x2*a+x1*x2*b=y1*x2
x2*x2*x1*a+x2*x1*b=y2*x1
(x1*x1*x2-x1*x2*x2)a=y1*x2-y2*x1
x1*x2*(x1-x2)a=y1*x2-y2*x1
*/
if(((pt[].x*pt[].x*(pt[].x-pt[].x))*(pt[].y*pt[].x-pt[].y*pt[].x))<)
puts("");
else puts("");
continue;
}
if(m==||m==)
{
ans=n;
//for(int i=1;i<=n;i++)
// printf("%f %f %d\n",pt[i].x,pt[i].y,vis[i]);
dfs();
printf("%d\n",ans);
}
if(m==)
{
ans=((n+)/+);
dfs();
printf("%d\n",ans);
}
}
return ;
}

Code

然后,改用了以猪头作为...线索(?姑且这么叫着吧,找不到什么更好的词)

把抛物线和没有放抛物线的猪头存下来,每次遍历到猪头的时候就看这个猪头有没有在抛物线上,如果有就不用管他。没有就考虑把这个猪头和前面没有打下来的猪头放在一起看能否组成一个新的开口向下的抛物线,或者让他单着。

感觉每次把前面的猪头取出来放回去的操作改成链表的话,就很想$DLX$了呢。

这种写法可以过,但是我不会证复杂度什么的。

机房$dalao$说用$DLX$+迭代加深不能过....我...也很疑惑...

 #include<cstdio>
#include<algorithm>
#include<vector>
#include<cstring>
#include<queue>
#include<map>
#include<iostream>
using namespace std;
#define ll long long
#define INF 0x3f3f3f3f
#define N 20
#define EPS 1e-8
double Abs(double a)
{
if(a>=0.0) return a;
return -a;
}
bool dy(double a,double b)
{//浮点误差
return Abs(a-b)<EPS;
}
int rd()
{
int f=,s=;char c=getchar();
while(c<''||c>''){if(c=='-') f=-;c=getchar();}
while(c>=''&&c<=''){s=(s<<)+(s<<)+(c^);c=getchar();}
return f*s;
}
int n,m,ans;
struct node{
double x,y;
}pt[N]/*猪*/,pwx[N]/*抛物线*/;
int id[N];//单独的猪的标号
void dfs(int k,int u/*抛物线*/,int v/*单独的猪*/)
{
if(u+v>=ans) return ;
if(k>n)
{
ans=min(ans,u+v);
return ;
}
bool flag=;
for(int i=;i<=u;i++)
if(dy(pwx[i].x*pt[k].x*pt[k].x+pwx[i].y*pt[k].x,pt[k].y))
{
dfs(k+,u,v);
flag=;
break;
}
if(flag) return ;//如果已经可以被打掉,就不用管了
//否则就 要么和其它猪形成抛物线 要么自己单独
double x1=pt[k].x,y1=pt[k].y;
for(int i=;i<=v;i++)
{
double x2=pt[id[i]].x,y2=pt[id[i]].y;
if(dy(x1,x2)) continue;
double a=(y1*x2-y2*x1)/(x1*x2*x1-x1*x2*x2);
if(a>=) continue;
double b=(y1*x2*x2-y2*x1*x1)/(x1*x2*x2-x1*x1*x2);
pwx[u+].x=a,pwx[u+].y=b;
int tmp=id[i];
for(int j=i;j<v;j++)
id[j]=id[j+];
dfs(k+,u+,v-);
for(int j=v;j>i;j--)
id[j]=id[j-];
id[i]=tmp;
}
id[v+]=k;
dfs(k+,u,v+);
}
int main()
{
int T=rd();
while(T--)
{
n=rd(),m=rd();
for(int i=;i<=n;i++)
scanf("%lf %lf",&pt[i].x,&pt[i].y);
if(n==)
{
puts("");
continue;
}
if(n==)
{
if(((pt[].x*pt[].x*(pt[].x-pt[].x))*(pt[].y*pt[].x-pt[].y*pt[].x))<)
puts("");
else puts("");
continue;
}
ans=n;
dfs(,,);
printf("%d\n",ans);
}
return ;
}

Code

至于正解的什么状压,不如...放飞象征和平的鸽子?

最新文章

  1. Android bluetooth用户自定义数据
  2. js 网站顶部导航栏
  3. ajax页面排序的序号问题
  4. 【BZOJ】1507: [NOI2003]Editor(Splay)
  5. BZOJ2783: [JLOI2012]树
  6. toast 防止一直不停弹出,累积显示
  7. Python练习题 029:Project Euler 001:3和5的倍数
  8. 轻松搞定Linux端口转发
  9. 存几个html画图的网站
  10. webapp之路--百度手机前端经验(转)
  11. HDU4127(IDA*)
  12. urls控制器
  13. ETL流程介绍及常用实现方法
  14. Python3 解析XML 层序遍历二叉树
  15. DNS协议工作过程;DNS的安全隐患
  16. C++之输出100-200内的素数
  17. Eclipse中执行Maven命令时控制台输出乱码
  18. 11.Curator扩展库
  19. 什么是ZooKeeper(一)(通俗易懂)
  20. BEGINNING SHAREPOINT&amp;#174; 2013 DEVELOPMENT 第2章节--SharePoint 2013 App 模型概览 总结

热门文章

  1. 快速傅立叶变换FFT模板
  2. vue学习时遇到的问题(一)
  3. spring-boot的三种启动方式
  4. linux下ssh免秘钥登录
  5. LA 4223 最短路 路径选择要求提高一点
  6. triplet
  7. 关于SpringBoot跨域的问题
  8. (二)C语言之常量
  9. git一键push至github脚本
  10. legend3---6、legend3爬坑杂记