这里给一下私藏的题目,棍子,挺难,不分析了,直接贴出代码,不过只有90。TLE超时。
poj上有题目,大家自己看看。
棍子
【问题描述】
一个电视节目正准备一个与观众互动的游戏,游戏的内容是让观众从箱子里抽出若干根棍子,若观众能成功地把抽出来的棍子摆成一个多边形,便可得到一份礼物。
当然,为了做好这个节目,这个游戏也需要精心设计,使得游戏既不会太难而影响现场气氛,也不会太容易而缺乏挑战性。要判断某个设计是否可取,关键要得出观众能成功抽取的方法有多少种,现在你接下了这项工作。
【输入格式】
第1行包含一个整数N。
第2行包含N个用空格隔开的整数ai,为各根棍子的长度。
【输出格式】
输出只有一行,包含一个整数,为取出的棍子能成功摆成一个多边形的方法数。
【样例】
stick.in | stick.out |
4 3 3 3 4 | 5 |
【数据范围】 3 3 3 3 3 4 3 3 4 3 3 4 3 3 3 4
30%的数据满足:N≤10,ai≤100;
50%的数据满足:N≤25,ai≤10000;
100%的数据满足:N≤50,ai≤200000000。
#include<stdio.h>
#include<iostream>
#include<algorithm>
#define LL long long
using namespace std;
const int MAX_N = 101;
const LL INF=10000000000;
LL N;
LL length[MAX_N];
LL s[MAX_N];
LL ans_0,ans_1;
LL p_0,p_1;
LL init()
{
int i;
scanf("%lld",&N);
for (i=1;i<=N;i++)
scanf("%lld",&length[i]),s[i]=s[i-1]+length[i];
sort(length+1,length+N+1);
}
LL put()
{
if (ans_1)
{
printf("%lld",ans_1);
printf("%010lld",ans_0);
}
else
printf("%lld",ans_0);
}
LL sp(int t)
{
int i;
p_0=1;
p_1=0;
for (i=1;i<=t;i++)
p_0*=2,p_1*=2,p_1+=p_0/INF,p_0%=INF;
}
LL dfs(LL t,LL max_length,LL sum)
{
if (!t)
{
if (sum<=max_length)
{
ans_0--;
if (ans_0<0) ans_0+=INF,ans_1--;
}
return 0;
}
if (sum>max_length) return 0;
if (sum+s[t]<=max_length)
{
sp(t);
return 0;
}
int i;
for (i=t-1;i>=0;i--)
if (sum+length[i]<=max_length)
dfs(i-1,max_length,sum+length[i]);
}
LL dfs_work()
{
printf("beginworking\n");
//sp(N);
//ans_0+=p_0,ans_1+=p_1,ans_1+=ans_0/INF,ans_0%=INF;
int i;
for (i=3;i<=N;i++)
printf("%dbegin",i),dfs(i,length[i],0),printf("%dend\n",i);
}
int main()
{
freopen("stick.in","r",stdin);
freopen("stick.out","w",stdout);
init();
dfs_work();
put();
return 0;
}