洛谷T1874 快速求和
本题思路非常明确:在所有能插入加号的位置枚举加号是否存在,对于每一种情况,若求得和为n则更新答案。
但是看看数据规模。。。长度<=40,也就是说枚举的时间最多可达2^39,显然会T,所以需要剪枝。
剪枝1:若整串拆分为单个数字后求和,所得结果>n,则一定无解。
原因:显然在一次拆分后,新生成的数字的和不会比未拆分之前的大(不要问我为什么,这是直觉)。
那么对于某个串,它对应的和最小的拆分方案即为:将其拆分为单个数字。
于是乎,整串对应的最小的和都>n,那么就不可能有可行解了。
剪枝2:若将未处理部分作为一个数字与已处理部分相加,所得的和<n,则在此递归子树中一定无解。
原因:类比一下剪枝1,可得:对于某个串,它对应的和最大的拆分方案为:直接将其转化为数字,即不拆分(不要问我为什么,这也是直觉)。
那么,将未处理部分作为一个数字与已处理部分相加,就是此递归子树中对应和最大的方案。
如果最大的和都<n,那么就不可能有可行解了。
剪枝3:若当前加号数量>=ans,则此递归子树中无更优解。这一点十分显然。
剪枝4:若将未处理部分拆分为单个数字后与已处理部分求和,所得的和>n,则在此递归子树中一定无解。
原因:同剪枝1。
剪枝5:若找到一个可行解,则此递归子树中无更优解。再搜下去,加号会增多,一定得不到比此可行解更优的解。
实现细节及剪枝位置详见代码及注释。
1 #include<cstdio> 2 #include<cstring> 3 4 using namespace std; 5 6 void dfs(int,int,int); 7 inline int val(int,int); //将某子串转化为数字 8 inline int min(int,int); 9 inline int qh(int,int); //将某子串拆分为单个数字后求和 10 11 char s[50]; 12 int a[50],l,ans=2147483647,sum=0,n; 13 14 int main(){ 15 scanf("%s",s+1); 16 scanf("%d",&n); 17 l=strlen(s+1); 18 for(int i=1;i<=l;i++){ 19 a[i]=s[i]-'0'; 20 sum+=a[i]; 21 } 22 if(sum>n){ 23 printf("-1\n"); //剪枝1 24 return 0; 25 } 26 else{ 27 dfs(0,0,0); 28 if(ans==2147483647)printf("-1\n"); 29 else printf("%d\n",ans); 30 } 31 32 return 0; 33 } 34 35 void dfs(int res,int p,int dep){ //res:已处理部分的和 p:标记已经处理到何处 dep:加号数量 36 int temp=res+val(p+1,l); //将未处理部分作为一个数字与已处理部分相加 37 if(temp<n)return; //剪枝2 38 if(dep>=ans)return; //剪枝3 39 if(res+qh(p+1,l)>n)return; //剪枝4 40 if(temp==n){ //找到可行解 41 ans=min(ans,dep); //更新答案 42 return; //剪枝5 43 } 44 for(int i=p+1;i<l;i++){ 45 temp=res+val(p+1,i); 46 dfs(temp,i,dep+1); 47 } 48 } 49 50 inline int val(int l,int r){ 51 int ans=0; 52 for(int i=l;i<=r;i++)ans=(ans<<3)+(ans<<1)+a[i]; 53 return ans; 54 } 55 56 inline int min(int x,int y){ 57 if(x<y)return x;else return y; 58 } 59 60 inline int qh(int l,int r){ 61 int ans=0; 62 for(int i=l;i<=r;i++)ans+=a[i]; 63 return ans; 64 }
转载于:https://www.cnblogs.com/running-coder-wfh/p/11163527.html
洛谷T1874 快速求和相关推荐
- 洛谷——P2415 集合求和
P2415 集合求和 题目描述 给定一个集合s(集合元素数量<=30),求出此集合所有子集元素之和. 输入格式 集合中的元素(元素<=1000) 输出格式 和 输入输出样例 输入 #1复制 ...
- 洛谷 B2059 奇数求和
奇数求和 题目描述 计算非负整数 mmm 到 nnn(包括 mmm 和 nnn)之间的所有奇数的和,其中,mmm 不大于 nnn,且 nnn 不大于 300300300.例如 m=3,n=12,m=3 ...
- 洛谷 P2415 集合求和【数学公式/模拟】
给定一个集合s(集合元素数量<=30),求出此集合所有子集元素之和. 输入输出格式 输入格式: 集合中的元素(元素<=1000) 输出格式: 和 输入输出样例 输入样例#1: 2 3 输出 ...
- 洛谷1226快速幂模板
题目描述 输入b,p,k的值,求b^p mod k的值.其中b,p,k*k为长整型数. 输入输出格式 输入格式: 三个整数b,p,k. 输出格式: 输出"b^p mod k=s" ...
- 洛谷 深基 第1部分 语言入门 第7章 函数与结构体
P5735 [深基7.例1]距离函数 [深基7.例1]距离函数 - 洛谷 P5735 [深基7.例1]距离函数(python3实现) P5735 [深基7.例1]距离函数(python3实现)_青少年 ...
- 算法刷题【洛谷P1593】因子和(附等比数列求和公式推导)
异想之旅:本人原创博客完全手敲,绝对非搬运,全网不可能有重复:本人无团队,仅为技术爱好者进行分享,所有内容不牵扯广告.本人所有文章仅在CSDN.掘金和个人博客(一定是异想之旅域名)发布,除此之外全部是 ...
- 洛谷 P3384 【模板】树链剖分-树链剖分(点权)(路径节点更新、路径求和、子树节点更新、子树求和)模板-备注结合一下以前写的题目,懒得写很详细的注释...
P3384 [模板]树链剖分 题目描述 如题,已知一棵包含N个结点的树(连通且无环),每个节点上包含一个数值,需要支持以下操作: 操作1: 格式: 1 x y z 表示将树从x到y结点最短路径上所有节 ...
- 洛谷 1226 取余运算||快速幂
洛谷 取余运算||快速幂 1226 其实比起楼下的大佬们,我主要是多了些位运算和讲解. 想法一: 直接输出 pow(b,q)%k 嗯~~勇气可嘉,但是看一眼数据范围(长整型)就会意识到,这个方法也许 ...
- 快速幂||取余运算【模板】(洛谷P1226题题解,Java语言描述)
题目要求 P1226题目链接 分析 标准的快速幂取模算法板子,之前这个算法我在这篇文章中讲过了:<快速幂算法详解&&快速幂取模算法详解>. 这里选择使用比较简单的API实现 ...
最新文章
- R语言使用ggpubr包的ggarrange函数组合多张结论图:使用ggpubr包在散点图的侧面添加辅助图形、并使用NULL将不需要可视化的侧面留白
- 时间罗盘html源代码_重磅!Vue 3.0源代码公布后,究竟有哪些变更?
- 项目:IT资源共享资源(登录前端)1
- ASP.NET的票据工具类FormsAuthenticationTicket
- android学习笔记33——资源ShapeDrawable
- 一个故事讲清楚 NIO
- Linux 配置JAVA_HOME
- kali linux fuzz工具集简述
- chrom浏览器-F2使用方法一
- 网站前端设计,从960框架开始
- android访问重定向地址,如何从android中重定向url加载图像(示例代码)
- JS的条形码和二维码生成
- laravel5.4根据数据表生成迁移文件
- 自动化测试之Appium模拟机测试
- 1008. 数组元素循环右移问题 (20)-PAT乙级真题
- 【免费毕设】ASP.NET通用作业批改系统设计(源代码+lunwen)
- 阶段3 3.SpringMVC·_06.异常处理及拦截器_6 SpringMVC拦截器之拦截器入门代码
- 基础实验——与V831串口通讯
- ps画画模糊笔刷_用ps污点画笔修复工具讲图片变成朦胧效果
- 美元指数展现王者风范 国际黄金重返下跌通道
热门文章
- HTTP 错误 500.22 - Internal Server Error 检测到在集成的托管管道模式下不适用的 ASP.NET 设置。...
- 算法6-1:哈希函数
- Oracle CheckPoint进程
- flink 异步io使用
- Bad level value for property: .level
- Exception in thread “main“ java.lang.NoClassDefFoundError: javax/script/Compilable
- Unable to instantiate org.apache.hadoop.hive.ql.metadata.SessionHiveMetaStoreClient
- celery异步邮件发送系统出现django.core.exceptions.ImproperlyConfigured: Requested setting EMAIL_FROM
- ubuntu+ngrok内网穿透+Flask部署以及frp稍微提一下
- kaggle删除自己的数据集