hdu 1455(Sticks 고전 심층 검색)
Sticks
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 6193 Accepted Submission(s): 1767
Problem Description
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.
Input
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.
Output
The output file contains the smallest possible length of original sticks, one per line.
Sample Input
9 5 2 1 5 2 1 5 2 1 4 1 2 3 4 0
6 5
思路:(1)题意从另一个角度可以这样理解,现有的n个有各自长度的木棍怎么组合拼接成k个木棍,使得k根木棍的长度相同。。那么肯定有很多种组合方法,现在要找到k根木棍长度最小的那种方法;
(2)经典深搜:将这n根木棍长度从大到小排序,并且求出n根木棍的总长度sum, 那么再想:最小值minn的范围肯定是在stick[0].lenth~sum之间,对吧/ ///,如果sum%minn==0(stick[0].lenth<=min<=sum)
说明i有可能成为最小值,接下来就是具体确定怎么拼接成长度为minn的若干个木棍;
#include
#include
#include
#include
#include
#include
#include
using namespace std;
int n,cnt,sum;// ,n ,sum n ,cnt=sum/i;
struct node
{
int lenth //
int mark; // ;
}stick[66];
int cmp(node a,node b) //
{
return a.lenth>b.lenth;
}
//len ,count ,
int dfs(int len,int count,int l,int pos)
{
if(len==sum) return 1; //
if(count==cnt) return 1;
for(int i=pos;i(stick[i].lenth+l))
{
stick[i].mark=1;
l+=stick[i].lenth;
if(dfs(len,count,l,i+1))
return 1;
l-=stick[i].lenth; // ,
stick[i].mark=0;
if(l==0) return 0;
while(stick[i].lenth==stick[i+1].lenth)i++; // 140MS, 31MS,ORZ
}
}
return 0;
}
int main()
{
while(cin>>n&&n)
{
cnt=sum=0;
for(int i=0;i>stick[i].lenth;
sum+=stick[i].lenth;
stick[i].mark=0;
}
sort(stick,stick+n,cmp);
for(int i=stick[0].lenth;i<=sum;i++)
{
if(sum%i)continue;
cnt=sum/i;
if(dfs(i,0,0,0))
{
printf("%d
",i);
break;
}
}
}
return 0;
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
[BOJ] 5568 카드 놓기아이디어 Level이 0일 때, 즉 아직 카드를 고르지 않았을 때 StringBuilder를 생성하고 sb에 고른 카드를 담도록 하였다. 이후 해당 노드 탐색을 종료하면 sb에 담은 카드를 삭제해 주었다....
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.