比赛 noip 评测结果 RRRRRRRRRRRRRRRRRRRR
题目名称 __完全平方数 最终得分 0
用户昵称 jiazihankk 运行时间 0.084 s
代码语言 C++ 内存使用 3.14 MiB
提交时间 2016-11-04 21:56:12
显示代码纯文本
  1. #include<cstdio>
  2. #include<algorithm>
  3. #include<cstring>
  4. #define rep(i,k,n) for(int i=k;i<=n;i++)
  5. using namespace std;
  6. const int inf=0x3f3f3f3f;
  7. const int M=67777;
  8. const int N=16;
  9. int f[10][M],x[N],y[N],K,n,m,S,val[M],ans;
  10. void init(int s){
  11. int mi_x,mx_x,mi_y,mx_y;
  12. mi_x=mi_y=M;
  13. mx_x=mx_y=-1;
  14. rep(i,0,n-1)if((s>>i)&1){
  15. mi_x=min(mi_x,x[i]);
  16. mi_y=min(mi_y,y[i]);
  17. mx_x=max(mx_x,x[i]);
  18. mx_y=max(mx_y,y[i]);
  19. }mi_x--,mi_y--;
  20. val[s]=2*(mx_x-mi_x + mx_y-mi_y);
  21. }
  22. int main(){
  23. freopen("xfence.in","r",stdin);
  24. freopen("xfence.out","w",stdout);
  25. scanf("%d%d%d",&m,&K,&n);
  26. memset(f,0x3f,sizeof(f));
  27. rep(i,0,n-1)scanf("%d%d",&x[i],&y[i]);
  28. S=(1<<n)-1;
  29. rep(i,1,S)init(i),f[1][i]=val[i];
  30. ans=val[S];
  31. rep(k,1,(K+1)/2-1){memcpy(f[k+1],f[k],sizeof(f[k]));
  32. rep(s,1,S){int res=f[k][s];
  33. int u=S^s;
  34. for(;u;u-=(u&-u))f[k+1][s^u]=min(f[k+1][s^u],res+val[u]);
  35. }
  36. }
  37. rep(k,1,(K+1)/2){
  38. rep(s,1,S)
  39. ans=min(ans,f[k][s]+f[K-k][S^s]);
  40. }
  41. printf("%d\n",ans);
  42. }