考试总结:这次考试,不是很顺利,首先看了一眼题目,觉得先做T1,想了一会觉得没什么好思路,就去打暴力,结果我不会枚举子集,码了半天发现不对,就随便交了一份代码上去,结果CE了,然后去打T3,20min打了个暴搜,结果最后全TLE,T2读了10多分钟才理解题义,但是没什么时间码了,就把T1的程序该了该交了,也不对,最后保龄了......

T1 毛一琛

思路:这题正解就是个暴搜,加上一个meet in the middle ,首先,我在考场上想到的是枚举子集,但是问题就是复杂度太高,而题解中运用到了一个状压的思想,在暴搜的过程中存储当前选择的数和当前的和,这样就可以很容易地找到所有的情况,同时,利用一个meet in the middle的思想,采用折半搜索,将前半段信息存储起来,用后半段去匹配。注意的是,暴搜的过程中要搜索三种情况,代码片段如下:

  1. iv dfs1(int x,int w)
  2. {
  3. if(x>n/2)
  4. {
  5. int zz=0;
  6. for(re i=1;i<=n/2;i++)
  7. zz=(zz<<1)|v[i];
  8. T.insert(zz,w);
  9. return;
  10. }
  11. v[x]=0,dfs1(x+1,w);//situation 1
  12. v[x]=1,dfs1(x+1,w+a[x]);//situation 2
  13. v[x]=1,dfs1(x+1,w-a[x]);//situation 3
  14. }

前两种情况很好理解,对于第三种情况,首先明确一个事情就是我们保存前半段信息,利用后半段去匹配,但是当前半段区间内部出现合法方案时,我们就要利用这第三个,因为当两边差值相同的时候必定是一种合法情况。代码如下:

AC_Code

  1. #include<bits/stdc++.h>
  2. #define re register int
  3. #define ii inline int
  4. #define iv inline void
  5. #define next neeet
  6. #define head heeead
  7. using namespace std;
  8. const int N=3e8+20;
  9. const int M=3e5+10;
  10. bool vis[1030][1030];
  11. unordered_map<int,int>head;
  12. int to[M],next[M],val[M];
  13. int n,tot,ans;
  14. int a[30],v[30];
  15. ii read()
  16. {
  17. int x=0;
  18. bool f=1;
  19. char ch=getchar();
  20. while(ch<'0'||ch>'9')
  21. {
  22. if(ch=='-')
  23. f=0;
  24. ch=getchar();
  25. }
  26. while(ch>='0'&&ch<='9')
  27. {
  28. x=(x<<1)+(x<<3)+(ch^48);
  29. ch=getchar();
  30. }
  31. return f?x:(-x);
  32. }
  33. struct Segment_cz
  34. {
  35. iv insert(int zz,int w)
  36. {
  37. int key=w;
  38. for(re i=head[key];i;i=next[i])
  39. {
  40. int p=to[i];
  41. if(p==zz&&val[i]==w)
  42. return;
  43. }
  44. to[++tot]=zz;
  45. val[tot]=w;
  46. next[tot]=head[key];
  47. head[key]=tot;
  48. }
  49. iv query(int zz,int w)
  50. {
  51. int key=w;
  52. for(re i=head[key];i;i=next[i])
  53. {
  54. if(val[i]==w&&(!vis[to[i]][zz]))
  55. {
  56. ++ans;
  57. vis[to[i]][zz]=1;
  58. }
  59. }
  60. return;
  61. }
  62. }T;
  63. iv dfs1(int x,int w)
  64. {
  65. if(x>n/2)
  66. {
  67. int zz=0;
  68. for(re i=1;i<=n/2;i++)
  69. zz=(zz<<1)|v[i];
  70. T.insert(zz,w);
  71. return;
  72. }
  73. v[x]=0,dfs1(x+1,w);
  74. v[x]=1,dfs1(x+1,w+a[x]);
  75. v[x]=1,dfs1(x+1,w-a[x]);
  76. }
  77. iv dfs2(int x,int w)
  78. {
  79. if(x>n)
  80. {
  81. int zz=0;
  82. for(re i=n/2+1;i<=n;i++)
  83. zz=zz<<1|v[i];
  84. T.query(zz,w);
  85. return;
  86. }
  87. v[x]=0,dfs2(x+1,w);
  88. v[x]=1,dfs2(x+1,w+a[x]);
  89. v[x]=1,dfs2(x+1,w-a[x]);
  90. }
  91. signed main()
  92. {
  93. n=read();
  94. for(re i=1;i<=n;i++)
  95. a[i]=read();
  96. dfs1(1,0);
  97. dfs2(n/2+1,0);
  98. printf("%d",ans-1);
  99. return 0;
  100. }


noip模拟测试30的更多相关文章

  1. [NOIP模拟测试30]题解

    A.Return 出题人大概是怕自己的中文十级没人知道,所以写了这么一个***题面.可能又觉得这题太水怕全场A掉后自己面子过不去,于是又故意把输出格式说的含糊不清.(鬼知道"那么输出-1&q ...

  2. NOIP模拟测试30「return·one·magic」

    magic 题解 首先原式指数肯定会爆$long$ $long$ 首先根据欧拉定理我们可以将原式换成$N^{\sum\limits_{i=1}^{i<=N} [gcd(i,N)==1] C_{G ...

  3. 「题解」NOIP模拟测试题解乱写II(36)

    毕竟考得太频繁了于是不可能每次考试都写题解.(我解释个什么劲啊又没有人看) 甚至有的题目都没有改掉.跑过来写题解一方面是总结,另一方面也是放松了. NOIP模拟测试36 T1字符 这题我完全懵逼了.就 ...

  4. 2019.8.3 [HZOI]NOIP模拟测试12 C. 分组

    2019.8.3 [HZOI]NOIP模拟测试12 C. 分组 全场比赛题解:https://pan.baidu.com/s/1eSAMuXk 刚看这题觉得很难,于是数据点分治 k只有1和2两种,分别 ...

  5. 2019.8.3 [HZOI]NOIP模拟测试12 B. 数颜色

    2019.8.3 [HZOI]NOIP模拟测试12 B. 数颜色 全场比赛题解:https://pan.baidu.com/s/1eSAMuXk 数据结构学傻的做法: 对每种颜色开动态开点线段树直接维 ...

  6. 2019.8.3 [HZOI]NOIP模拟测试12 A. 斐波那契(fibonacci)

    2019.8.3 [HZOI]NOIP模拟测试12 A. 斐波那契(fibonacci) 全场比赛题解:https://pan.baidu.com/s/1eSAMuXk 找规律 找两个节点的lca,需 ...

  7. NOIP模拟测试17&18

    NOIP模拟测试17&18 17-T1 给定一个序列,选取其中一个闭区间,使得其中每个元素可以在重新排列后成为一个等比数列的子序列,问区间最长是? 特判比值为1的情况,预处理比值2~1000的 ...

  8. 「题解」NOIP模拟测试题解乱写I(29-31)

    NOIP模拟29(B) T1爬山 简单题,赛时找到了$O(1)$查询的规律于是切了. 从倍增LCA那里借鉴了一点东西:先将a.b抬到同一高度,然后再一起往上爬.所用的步数$×2$就是了. 抬升到同一高 ...

  9. 2019.7.29 NOIP模拟测试10 反思总结【T2补全】

    这次意外考得不错…但是并没有太多厉害的地方,因为我只是打满了暴力[还没去推T3] 第一题折腾了一个小时,看了看时间先去写第二题了.第二题尝试了半天还是只写了三十分的暴力,然后看到第三题是期望,本能排斥 ...

随机推荐

  1. 机器人路径规划其二 A-Star Algorithm【附动态图源码】

    首先要说明的是,机器人路径规划与轨迹规划属于两个不同的概念,一般而言,轨迹规划针对的对象为机器人末端坐标系或者某个关节的位置速度加速度在时域的规划,常用的方法为多项式样条插值,梯形轨迹等等,而路径规划 ...

  2. WEB安全新玩法 [5] 防范水平越权之查看他人订单信息

    水平越权是指系统中的用户在未经授权的情况下,查看到另一个同级别用户所拥有的资源.水平越权会导致信息泄露,其产生原因是软件业务设计或编码上的缺陷.iFlow 业务安全加固平台可以缓解部分场景下的水平越权 ...

  3. hive学习笔记之七:内置函数

    欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...

  4. hdu 2842 Chinese Rings 矩阵快速幂

    分析: 后面的环能不能取下来与前面的环有关,前面的环不被后面的环所影响.所以先取最后面的环 设状态F(n)表示n个环全部取下来的最少步数 先取第n个环,就得使1~n-2个环属于被取下来的状态,第n-1 ...

  5. pip与apt-get的使用

    pip的使用 pip 是 Python 包管理工具,该工具提供了对Python 包的查找.下载.安装.卸载的功能. pip --version    #python2.x 版本命令,显示版本和路径 p ...

  6. 可执行jar包在windows server2008下的自启动

    最近要部署项目的服务端在windows server2008下面,所以把项目打包成可执行的jar包,然后希望它能开机自启动,毕竟每次都在cmd下输入java -jar xxx.jar才能启动太繁琐了. ...

  7. Acunetix与WAF集成:Acunetix和F5 BigIP ASM

    该的Acunetix API让您有机会来实现任务自动化,从而提高效率-尤其是当你可以用加速您的工作流程的其他组件的功能整合.在此示例中,我们将在上一篇文章的基础上,向您展示如何在Bash脚本中使用Ac ...

  8. coretext简单使用

    相对于UIKit,使用coretext绘制文本效率高,具有更高的自由度,可随时插入图片,增加文本点击事件等. 1.增加文本的点击事件 思路:定义UILabel子类,设置可点击的富文本range及其他属 ...

  9. 26. Remove Duplicates from Sorted Array*(快慢指针)

    description: Given a sorted array nums, remove the duplicates in-place such that each element appear ...

  10. 查找----python

    class Solution: #顺序查找 def seq_search(self,list,num): for i in(range(len(list))): if list[i] == num: ...