| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
按升序排超时,按降序就ac(附代码)一下午都花在这个上面,结果按照降序排列立马AC
#include<iostream>
#include<algorithm>
using namespace std;
int num;
int sticks[64];
bool state[64];
int lenth;
int cmp(int a,int b)
{
return a>b;
}
int minStick(int);
bool judge(int,int,int,int);
int main()
{
while(cin>>num && num)
{
int sum = 0;
for(int i=0;i<num;i++)
{
cin>>sticks[i];
sum += sticks[i];
}
cout<<minStick(sum)<<endl;
}
return 0;
}
int minStick(int sum)
{
sort(sticks,sticks+num,cmp);
for(int i=num;i>=1;i--)
{
if(sum % i)
{
continue;
}
if(sum/i < sticks[0])
{
continue;
}
memset(state,0,sizeof(state));
state[0] = true;
if(judge(sticks[0],sum/i,sum,1))
{
return sum / i;
}
}
return -1;
}
bool judge(int len,int goal,int rest,int index)
{
int wrongstick = 0;
if(rest == 0)
{
return true;
}
if(len == goal)
{
return judge(0,goal,rest-goal,0);
}
for(int i = index;i<num;i++)
{
if(state[i])
{
continue;
}
if(len+sticks[i] > goal)
{
continue;
}
if(sticks[i] == wrongstick)
{
continue;
}
state[i] = true;
if(judge(len+sticks[i],goal,rest,i+1))
{
return true;
}
wrongstick = sticks[i];
state[i] = false;
if(index == 0)
{
break;
}
}
return false;
}
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator