当前位置: 首页 > news >正文

P1120 小木棍 [数据加强版]

题目描述

乔治有一些同样长的小木棍,他把这些木棍随意砍成几段,直到每段的长都不超过50。

现在,他想把小木棍拼接成原来的样子,但是却忘记了自己开始时有多少根木棍和它们的长度。

给出每段小木棍的长度,编程帮他找出原始木棍的最小可能长度。

输入输出格式

输入格式:

 

输入文件共有二行。

第一行为一个单独的整数N表示砍过以后的小木棍的总数,其中N≤65

(管理员注:要把超过50的长度自觉过滤掉,坑了很多人了!)

第二行为N个用空个隔开的正整数,表示N根小木棍的长度。

 

输出格式:

 

输出文件仅一行,表示要求的原始木棍的最小可能长度

 

输入输出样例

输入样例#1:
9
5 2 1 5 2 1 5 2 1
输出样例#1:
6

这题挺坑的,数据量太大了,无奈看了看题解
题解加了许多剪枝
1.从大到小排序
2.每次枚举的时候从上一个结束的地方枚举
3.相同长度不枚举
4.如果是当前的长度不能构成答案需要的长度,直接退出
还有就是二分答案貌似写不出来。。
 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<cmath>
 5 #include<algorithm>
 6 using namespace std;
 7 const int MAXN=71;
 8 void read(int &n)
 9 {
10     char c='+';int x=0;bool flag=0;
11     while(c<'0'||c>'9')
12     {c=getchar();if(c=='-')flag=1;}
13     while(c>='0'&&c<='9')
14     {x=x*10+(c-48);c=getchar();}
15     flag==1?n=-x:n=x;
16 }
17 int a[MAXN];
18 int num=0;
19 int n,p;
20 int tot=0;
21 int k; 
22 int vis[MAXN];
23 int comp(int a,int b)
24 {return a>b;}
25 bool dfs(int now,int bg,int have,int need)
26 // 需要拼接的长度  开始的值  已经拼好的组数  需要拼接的长度 
27 {
28     if(have==k)
29         return 1;
30     if(now==0)
31         if(dfs(need,1,have+1,need))
32             return 1;
33     for(int i=bg;i<=num;i++)
34     {
35         if(vis[i]==0&&a[i]<=now)
36         {
37             vis[i]=1;
38             if(dfs(now-a[i],i+1,have,need))
39                 return 1;
40             vis[i]=0;
41             if(now==need||now==a[i])break;
42             while(a[i+1]==a[i])
43                 i++;
44         }
45     }
46     return 0;
47 }
48 int main()
49 {
50     //freopen("sticka.in","r",stdin);
51     //freopen("sticka.out","w",stdout);
52     read(n);
53     for(int i=1;i<=n;i++)
54     {
55         read(p);
56         if(p<=50)
57         {
58             a[++num]=p;        
59             tot+=p;
60         }    
61     }
62     sort(a+1,a+num+1,comp);
63     for(int i=a[1];i<=tot;i++)
64     {
65         if(tot%i==0)
66         {
67             k=tot/i;
68             if(dfs(i,1,0,i))
69             {
70                 printf("%d",i);
71                 return 0;
72             }
73         }
74         
75     }
76     return 0;
77 }

 

 

相关文章:

  • Oracle 11gR2 List-Range分区实验
  • python操作excel
  • 一行命令搞定node.js升级
  • 仿射梯度
  • Snapchat发布不到2个月的故事搜索功能,又双叒被Instagram抄袭了
  • 中芯国际第三财季净利润1.136亿美元
  • Jmeter常用函数之__CSVRead使用
  • 苹果计划在英国建立新总部 位于巴特西发电站旧址
  • 保监会:大数据改变保险运作模式
  • 分布式光伏渐入理想状态?
  • 提高人民媒介素养,加强网络安全建设
  • 大力发展互联网经济积极推进智慧城市建设
  • Teradata扩展数据湖搭建能力
  • 大数据:新动力 新机遇 新途径
  • D1net阅闻:比上周更可怕的勒索病毒入侵电脑
  • 《网管员必读——网络组建》(第2版)电子课件下载
  • canvas 高仿 Apple Watch 表盘
  • extjs4学习之配置
  • Spring核心 Bean的高级装配
  • TCP拥塞控制
  • TiDB 源码阅读系列文章(十)Chunk 和执行框架简介
  • 删除表内多余的重复数据
  • 通过几道题目学习二叉搜索树
  • 小程序01:wepy框架整合iview webapp UI
  • 移动端 h5开发相关内容总结(三)
  • 400多位云计算专家和开发者,加入了同一个组织 ...
  • LIGO、Virgo第三轮探测告捷,同时探测到一对黑洞合并产生的引力波事件 ...
  • Python 之网络式编程
  • #宝哥教你#查看jquery绑定的事件函数
  • $.ajax()参数及用法
  • (02)Cartographer源码无死角解析-(03) 新数据运行与地图保存、加载地图启动仅定位模式
  • (C语言)fread与fwrite详解
  • (第一天)包装对象、作用域、创建对象
  • (转)JVM内存分配 -Xms128m -Xmx512m -XX:PermSize=128m -XX:MaxPermSize=512m
  • .md即markdown文件的基本常用编写语法
  • .NET Core IdentityServer4实战-开篇介绍与规划
  • .NET Framework与.NET Framework SDK有什么不同?
  • .net MVC中使用angularJs刷新页面数据列表
  • .NET 中小心嵌套等待的 Task,它可能会耗尽你线程池的现有资源,出现类似死锁的情况
  • .NET成年了,然后呢?
  • .NET学习全景图
  • .NET正则基础之——正则委托
  • .net中的Queue和Stack
  • //解决validator验证插件多个name相同只验证第一的问题
  • /var/spool/postfix/maildrop 下有大量文件
  • @Autowired @Resource @Qualifier的区别
  • @ConditionalOnProperty注解使用说明
  • @Not - Empty-Null-Blank
  • @ResponseBody
  • [BUG] Hadoop-3.3.4集群yarn管理页面子队列不显示任务
  • [BZOJ 1040] 骑士
  • [BZOJ4016][FJOI2014]最短路径树问题
  • [Fri 26 Jun 2015 ~ Thu 2 Jul 2015] Deep Learning in arxiv
  • [halcon案例2] 足球场的提取和射影变换
  • [Jenkins] Docker 安装Jenkins及迁移流程