资源限制
时间限制:1.0s 内存限制:999.4MB
  Sticks
Time Limit: 1000MS Memory Limit: 10000K
Total Submissions: 113547 Accepted: 26078
问题描述
  George took sticks of the same length and cut them randomly until all parts became at most 50 units long. Now he wants to return sticks to the original state, but he forgot how many sticks he had originally and how long they were originally. Please help him and design a program which computes the smallest possible original length of those sticks. All lengths expressed in units are integers greater than zero.
输入格式
  The input contains blocks of 2 lines. The first line contains the number of sticks parts after cutting, there are at most 64 sticks. The second line contains the lengths of those parts separated by the space. The last line of the file contains zero.
输出格式
  The output should contains the smallest possible length of original sticks, one per line.
样例输入
9
5 2 1 5 2 1 5 2 1
4
1 2 3 4
0
样例输出
5
6

题目大意:
乔治拿来一组等长的木棒,将它们随机地砍断,使得每一节木棍的长度都不超过50个长度单位。然后他又想把这些木棍恢复到为裁截前的状态,但忘记了初始时有多少木棒以及木棒的初始长度。请你设计一个程序,帮助乔治计算木棒的可能最小长度。每一节木棍的长度都用大于零的整数表示。

1)不要在同一个位置多次尝试相同长度的木棒(在某一次拼接时选择长度为s的木棒导致拼接失败,则在同一位置尝试下一根木棒时,要跳过所有长度为s的木棒)
2)如果由于以后的拼接失败,需要重新调整第i根棍子的拼法,则不会考虑替换第i根棍子中的第一根木棒。
3)不要希望通过仅仅替换已经拼好的棍子的最后一根木棒就能改变失败的局面。
4)拼每一根棍子的时候,应确保已经拼好的部分,长度是从长到短排列的(因为我们应该先拼长的,长的可能性小)
排除方法:每次找一根木棒的时候,只要这不是一根棍子的第一条木棒,那么不应该从下标为0的木棒开始找,而应该从刚刚接上去的那条木棒的下一条开始找(当然,我们要先对木棒进行从大到小的排序)

#include <cstdio>
#include <cstring>
#include <algorithm>using namespace std;int a[105],n,cnt,num,vis[105]; //a数组用来记录数据,n是数据个数,vis是选中标记数组int cmp(int a,int b)   //排序函数
{return a > b;
}bool dfs(int sticks,int now,int last)
{//sticks:表示当前处理第几根新棒子了。
//cab:表示当前这个棒子已经拼接到多长了。
//last:表示用到了第几根砍断的棒子了 if(sticks >= cnt + 1)return true;   //当处理过的棒子多余实际个数时,返回trueif(now == num)return dfs(sticks + 1,0,1);    //当现在处理的这根棒子已经达到实际长度时,now归零,sticks+1int fail = 0;//  记录连接失败的棒子的长度,防止后面相同尺寸的棒子在进行连接for(int i = last;i <= n;i++)   //从last开始枚举{if(vis[i] || a[i] == fail || now + a[i] > num)continue; //vis数组和合理性判断,访问过或者和前面失败的尺寸一样或者加上这条棒子就超过尺寸了,就跳出循环vis[i] = 1;   //将这条棒子设为已经访问if(dfs(sticks,now + a[i],i + 1))return true;   //将now加上本条棒子的尺寸vis[i] = 0;  //回溯fail = a[i];    //将fail值记为aiif(now == 0 || now + a[i] == num)return false; //出现这样的情况意味着只能这样选,还是选不了就意味着这种状态不合法。}return false;
}int main()
{while(~scanf("%d",&n) && n)   //多组输入,遇零停止{int mx = 0,sum = 0;  //记录总和和最大值,答案一定在这个区间中for(int i = 1;i <= n;i++)   //输入数据寻找最大直{scanf("%d",&a[i]);mx = max(a[i],mx);sum += a[i];}sort(a + 1,a + 1 + n,cmp);   //大到小排序for(int i = mx;i <= sum;i++)  //遍历目标答案{if(sum % i)continue;     //如果枚举出来的答案不能被段数整除,则跳过cnt = sum / i;num = i;   //因为刚开始时每段的木棒都是一样长的,所以可以计算出原始的长度和根数,其中cnt是根数memset(vis,0,sizeof(vis));  //初始化标记数组if(dfs(1,0,1))  //开始深搜{printf("%d\n",i);   //如果有满足条件的输出break;}}}return 0;
}

蓝桥杯 算法训练 Sticks相关推荐

  1. 蓝桥杯算法训练sticks

    持续更新蓝桥杯算法训练题解,有兴趣可以关注一波呀. 文章目录 题目 题解 数据传送阵 代码传送阵 题目 George took sticks of the same length and cut th ...

  2. java折木棍_蓝桥杯算法训练 Sticks(木棍)问题(JAVA)

    问题描述 乔治拿来一组等长的木棒,将它们随机地砍断,使得每一节木棍的长度都不超过50个长度单位.然后他又想把这些木棍恢复到为裁截前的状态,但忘记了初始时有多少木棒以及木棒的初始长度.请你设计一个程序, ...

  3. 蓝桥杯 算法训练 幸运的店家

    蓝桥杯 算法训练 幸运的店家 题目描述 资源限制 时间限制:1.0s 内存限制:256.0MB 问题描述 炫炫开了一家商店,卖的货只有一个,XXX,XXX卖N元钱.有趣的是,世界上只有面值为3的幂的纸 ...

  4. 蓝桥杯 算法训练 Beaver's Calculator

    蓝桥杯 算法训练 Beaver's Calculator 问题描述 从万能词典来的聪明的海狸已经使我们惊讶了一次.他开发了一种新的计算器,他将此命名为"Beaver's Calculator ...

  5. 蓝桥杯 算法训练 印章

    蓝桥杯 算法训练 印章 共有n种图案的印章,每种图案的出现概率相同.小A买了m张印章,求小A集齐n种印章的概率. 输入输出: 一行两个正整数n和m 一个实数P表示答案,保留4位小数. 样例: 2 3 ...

  6. 蓝桥杯算法训练-24点(Python)

    问题描述 24点游戏是一个非常有意思的游戏,很流行,玩法很简单:给你4张牌,每张牌上有数字(其中A代表1,J代表11,Q代表12,K代表13),你可以利用数学中的加.减.乘.除以及括号想办法得到24, ...

  7. 蓝桥杯——算法训练——数字三角形

    蓝桥杯--算法训练--数字三角形 这道题不难,但是比较典型,可以作为动态规划(dp)的入门篇,属于线性dp(LIS,LCS和数字三角形都是此类题型). ------------------------ ...

  8. 蓝桥杯算法训练-强力党逗志芃

    持续更新蓝桥杯算法训练题解,有兴趣可以关注一波呀 题目 逗志芃励志要成为强力党,所以他将身上所以的技能点都洗掉了重新学技能.现在我们可以了解到,每个技能都有一个前提技能,只有学完了前提技能才能学习当前 ...

  9. 蓝桥杯 算法训练 逗志芃的危机

    蓝桥杯 算法训练 逗志芃的危机 题目描述 资源限制 时间限制:1.0s 内存限制:256.0MB 问题描述 逗志芃又一次面临了危机.逗志芃的妹子是个聪明绝顶的人,相比之下逗志芃就很菜了.现在她妹子要和 ...

最新文章

  1. oracle汉化包下载地址
  2. UVA 307 Sticks
  3. python台风动图绘制_使用Python绘制台风轨迹图的示例代码
  4. linux c++线程池的实现
  5. vue获取剪切板内容_vue通过clipboard插件实现复制到剪切板功能
  6. 使用MyEclipse建立working set
  7. Deepin-安装QQ音乐(Windows程序)
  8. 强悍的 ubuntu —— 窗口界面管理与设置
  9. 【哈工大SCIR Lab】Attention!注意力机制可解释吗?
  10. AutoCAD实用功能之查看xdata扩展属性
  11. C# MessageBox用法实例
  12. 双组百分比堆积柱形图的制作
  13. 苹果系统itunes连iphone连不上服务器,itunes无法连接iphone的解决方法
  14. excel删除无尽空白行_如何在EXCEL中隔行插入空行与批量删除空行
  15. H1B工作签证·绿卡:美国留学的两个关键步骤
  16. VT系列一:VT简述
  17. 【转摘】在Word中使用SmartArt绘制组织结构图
  18. linux下硬盘读写速度测试
  19. 顺为、小米联合领投支出宝,官网启用三拼域名!
  20. python:鸡尾酒疗法

热门文章

  1. bootstrap分割式下拉菜单显示不全
  2. 机试题:地图定位、拍照并显示、录制视频并播放
  3. Linux中配置网桥
  4. 人工神经网络(Artificial Neural Netwroks)笔记-消除样本顺序的BP算法
  5. SSLOJ 1335.蛋糕切割
  6. preventDefault() 方法 取消事件的默认动作
  7. MACOS-Can't-connect-to-local-MySQL-server-through-socket-'/tmp/mysql.sock'
  8. Node buffer
  9. bankbone 模型简单介绍
  10. js中数组的一些操作