2017.7.28 愤怒的小鸟 思考记录

来源:互联网 发布:找到网络打印机 编辑:程序博客网 时间:2024/05/17 00:52

现在来看,这个noip的状压dp就不是很难了

先枚举抛物线(一个确定的,两个确定的)

再对每个抛物线枚举目标,把能打的压在一起

最后扫一遍抛物线,枚举状态出最优解即可


注意此题精度!设成0.00005只能过92分

需要设成0.0000005  (玄学?)


码:

#include<iostream>#include<cstdio>#include<cstring>using namespace std;int f[1<<20],zt[50000],cnt,n,T,m;#define esp 0.0000005double x[20],y[20];int main(){scanf("%d",&T);while(T--){memset(f,0x6f,sizeof(f));memset(zt,0,sizeof(zt));cnt=0;scanf("%d%d",&n,&m);for(int i=1;i<=n;i++)scanf("%lf%lf",&x[i],&y[i]);if(n==1){printf("1\n");continue;}for(int i=1;i<=n;i++){zt[++cnt]=(1<<(i-1));for(int j=i+1;j<=n;j++){double a=y[i]*x[j]-y[j]*x[i];a/=(x[i]*x[i]*x[j]-x[j]*x[j]*x[i]);if(a>=0)continue;double b=(y[j]-x[j]*x[j]*a)/x[j];++cnt;for(int k=1;k<=n;k++)if(a*x[k]*x[k]+b*x[k]<=y[k]+esp&&a*x[k]*x[k]+b*x[k]>=y[k]-esp){zt[cnt]|=1<<(k-1);} }}f[0]=0;for(int i=1;i<=cnt;i++)for(int j=0;j<(1<<n);j++)f[j|zt[i]]=min(f[j|zt[i]],f[j]+1);printf("%d\n",f[(1<<n)-1]);} } 


原创粉丝点击