博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
9.18考试 第一题count题解
阅读量:5836 次
发布时间:2019-06-18

本文共 1530 字,大约阅读时间需要 5 分钟。

  这道题说起来挺可惜的,当时纠结是用常数大但有可能减少递归层数的模还是用常数小但递归多的回溯纠结了好半天,最终错误的选择了模。导致T了20分,改成回溯就A了。

  先分析一下性质,我在考试的时候打表发现在数据范围内因子最多有240个,因此有可能是通过枚举因子进行计算,然后如果说对于一个块他的确可以把一棵树分为几块方法只有一种(不要问我为什么,我也不知道怎么证,但的确如此)那么我们的最坏复杂度就是O(240*n),比理论最大复杂度还多了一倍,这也是为什么当时我自己预估60分的原因,然而这就很尴尬了,这的确能过,因为我们只要搜索到一个不合法位置就可以直接return所以会快许多。而且,对于size小于当前check的我们就没有必要再去搜了,这会降低对于较大因子的时间复杂度。然后就很玄学的过了,额,过了……

1 #include
2 #include
3 #include
4 #include
5 #include
6 #include
7 #include
8 #include
9 #include
10 #define N 100000511 using namespace std;12 int size[N],fa[N],n,a[N];13 struct ro14 {15 int to,next;16 }road[N*2];17 int zz1,zz,sx[N];18 void build(int x,int y)19 {20 zz++;21 road[zz].to=y;22 road[zz].next=a[x];23 a[x]=zz;24 }25 void dfs(int x)26 {27 size[x]=1;28 for(int i=a[x];i>0;i=road[i].next)29 {30 int y=road[i].to;31 if(y==fa[x])continue;32 fa[y]=x;33 dfs(y);34 size[x]+=size[y];35 }36 }37 int ans=2;38 bool yx;39 int dfs2(int x,int l)40 {41 int sum=1;42 for(int i=a[x];i>0;i=road[i].next)43 {44 int y=road[i].to;45 if(y==fa[x])continue;46 if(size[y]>=l)47 {48 int k=dfs2(y,l);49 if(k==-1)50 return -1;51 sum+=k;52 }53 else54 {55 sum+=size[y];56 }57 if(sum>l)58 {59 return -1;60 }61 }62 if(sum==l)63 {64 return 0;65 }66 else return sum;67 }68 void check(int l)69 {70 int k=dfs2(1,l);71 if(k!=-1)72 ans++;73 }74 int main()75 {76 scanf("%d",&n);77 for(int i=1;i
View Code

转载于:https://www.cnblogs.com/liutianrui/p/7552581.html

你可能感兴趣的文章
华为 EC169 3G上网卡在MacPro中的使用
查看>>
nginx 启动关闭脚本【Linux运维之道之脚本案例】
查看>>
OpenSSL漏洞凶猛来袭 慧眼恶意代码监测应对有方
查看>>
C语言 喝汽水问题
查看>>
LINUX中搭建DNS服务器,实现正向、反向以及访问不同DNS解析
查看>>
SCCM2012 R2实战系列之十:解决WDS服务无法启动问题(错误1067:进程意外终止)...
查看>>
怎么防止重复发送Ajax
查看>>
当我们谈论知识管理时,我们在谈论什么?
查看>>
eclipse设置断点不停的原因
查看>>
ubuntu 下安装 mysql
查看>>
Python json.dumps 中文乱码解决
查看>>
HTM5基础系列(一)---简介与HTML4与HTML5的区别
查看>>
Hbase快速开始——shell操作
查看>>
WireShark 过滤语法
查看>>
linux删除文件后没有释放空间
查看>>
redis 内存管理分析
查看>>
Sharding-JDBC 最大努力型事务理解
查看>>
扩展segment数量
查看>>
Cisco 交换机端口安全
查看>>
cv.Mat 与 .txt 格式文件读写操作
查看>>