noip2016 提高组
2017-07-06 16:42
344 查看
T1 玩具谜题 题目传送门
这道题直接模拟就好了哇 233
#include<cstdio> #include<cstring> #include<algorithm> #include<cmath> using namespace std; const int M=25; int read(){ int ans=0,f=1,c=getchar(); while(c<'0'||c>'9'){if(c=='-') f=-1; c=getchar();} while(c>='0'&&c<='9'){ans=ans*10+(c-'0'); c=getchar();} return ans*f; } int T,n,m; int g[M][M],f[1<<M],id[M]; double x[M],y[M],a,b; bool pd(double x,double y){return fabs(x-y)<1e-6;} void push_ans(){ n=read(); m=read(); for(int i=1;i<=n;i++) scanf("%lf %lf",&x[i],&y[i]); memset(g,0,sizeof(g)); for(int i=1;i<=n;i++){ for(int j=i+1;j<=n;j++){ if(pd(x[i],x[j])) continue; a=(y[i]/x[i]-y[j]/x[j])/(x[i]-x[j]); if(a>=0) continue; b=y[i]/x[i]-a*x[i]; int sum=0; for(int k=1;k<=n;k++) if(pd(a*x[k]+b,y[k]/x[k])) sum+=id[k]; g[i][j]=sum; } } memset(f,0x3f,sizeof(f)); f[0]=0; for(int k=0;k<(1<<n);k++) for(int i=1;i<=n;i++){ if(id[i]&k) continue; for(int j=i+1;j<=n;j++) f[k|g[i][j]]=min(f[k|g[i][j]],f[k]+1); f[id[i]|k]=min(f[id[i]|k],f[k]+1); } printf("%d\n",f[(1<<n)-1]); } int main() { for(int i=1;i<M;i++) id[i]=1<<(i-1); for(T=read();T;T--) push_ans(); return 0; }View Code
相关文章推荐
- NOIP2016提高A组模拟9.15 总结
- NOIP2016提高A组集训第1场【JZOJ4822】完美标号
- NOIP2016提高组复赛
- NOIP2016提高组比赛总结
- 愤怒的小鸟(NOIP2016提高组Day2T3)
- NOIP2016提高组酱油记_(:зゝ∠)_
- [题解]NOIP2016提高组の题解集合 - by xyz32768
- NOIP2016提高A组模拟9.17
- 2016.10.5【NOIP2016提高A组五校联考2】总结
- NOIP2016提高A组集训第1场 【JZOJ4824】配对游戏
- 组合数问题(NOIP2016提高组Day2T1)
- NOIP2016 提高组 总结
- 挑战nbc (noip2016)膜你赛Day1提高组
- NOIP2016提高组解题报告!
- NOIP2016 提高组 解题报告
- 蚯蚓(NOIP2016 提高组 第二试 第二题,队列的应用)
- NOIP2016提高A组集训第8场11.5 总结
- NOIP2016 提高组 Day1 解题思路
- NOIP2016提高组题解
- 树塔狂想曲【NOIP2016提高A组模拟9.3】