洛谷 P1120 小木棍 [数据加强版]
2024-10-20 16:07:50
题目描述
乔治有一些同样长的小木棍,他把这些木棍随意砍成几段,直到每段的长都不超过50。
现在,他想把小木棍拼接成原来的样子,但是却忘记了自己开始时有多少根木棍和它们的长度。
给出每段小木棍的长度,编程帮他找出原始木棍的最小可能长度。
输入输出格式
输入格式:
输入文件共有二行。
第一行为一个单独的整数N表示砍过以后的小木棍的总数,其中N≤65
(管理员注:要把超过50的长度自觉过滤掉,坑了很多人了!)
第二行为N个用空个隔开的正整数,表示N根小木棍的长度。
输出格式:
输出文件仅一行,表示要求的原始木棍的最小可能长度
输入输出样例
说明
2017/08/05
数据时限修改:
-#17 #20 #22 #27 四组数据时限500ms
-#21 #24 #28 #29 #30五组数据时限1000ms
其他时限改为200ms(请放心食用)
思路:各种优化的搜索。
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
int n,m,mx,sum;
int num[],vis[];
int cmp(int a,int b){
return a>b;
}
void dfs(int ans,int s,int goal,int now){
if(s*goal==sum){ printf("%d",goal); exit(); }
if(sum-ans<num[m]) return ;
if(ans==goal){ dfs(,s+,goal,);return ; }
for(int i=now;i<=m;i++){
if(!vis[i]&&num[i]+ans<=goal){
vis[i]=;
dfs(ans+num[i],s,goal,i+);
vis[i]=;
if(ans+num[i]==goal||ans==) break;
while(num[i]==num[i+]) i++;
}
}
}
int main(){
scanf("%d",&n);
for(int i=;i<=n;i++){
int x;scanf("%d",&x);
if(x>) continue;
num[++m]=x;sum+=x;
mx=max(mx,x);
}
sort(num+,num++m,cmp);
for(int i=mx;i<=sum/;i++)
if(sum%i==)
dfs(,,i,);
printf("%d",sum);
}
最新文章
- Raspberry Pi(树莓派)上安装Raspbian(无路由器,无显示器)
- hammer用法 jquery.hammer.js
- 如何在LIRE搜索中使用多特征
- Android IPC机制之Messenger
- 贪吃蛇(C++实现,VC6.0编译,使用了EasyX图形库)
- Python 实现粒子滤波
- Android平板上开发应用的一点心得——精确适配不同的dpi和屏幕尺寸
- MSDE简介
- C#使用原生的Directx和OpenGL绘图
- eclipse gradle 自动打包
- jQuery骨架
- 日志管理 rsyslog服务浅析
- HIdernate入门
- QT---系统托盘图标不显示原因
- 《JAVA与模式》之命令模式
- 【Alpha阶段】第四次scrum meeting
- Oracle 存储过程简单语法
- STM32CubeMX+Keil裸机代码风格(1)
- Spring框架的四大原则
- ECONOMETRICS CHAPTER1