聪明的阿卑多

聪明的阿卑多

 

Time Limit:   1000MS       Memory Limit:   65535KB
Submissions:   4       Accepted:   1

 

Description
题意描述: 也许你从没听说过阿卑多,但你一定知道他爷爷的爷爷的爷爷,那就是聪明绝顶的阿凡提先生。是的,阿卑多也是个聪明的小孩。 一天,阿卑多骑着他的小毛驴,在小镇上晃悠,正好遇上了小巴依——那个自以为是的小财主。小巴依正在炫耀他的金币: “你们见过这样的金币么?这可不是一般的金币,你看它们多大多重啊!最主要的是,它们每个上面都刻有我的名字和一个编号,是独一无二的!看看,从我出生开始,每2个月,爸爸便给我1个特做的大金币,并从1开始编号,现在我已经有60枚了,哈哈……” 小巴依见了阿卑多,于是便想考一考他:“阿卑多,听说你是最聪明的。看见我每个金币上的数字了吗?你现在拿取一半的金币,并能用你拿的若干金币上的数的和表示我的任意一枚金币上的数。如果你能办到,那么就奖你一枚金币;如果不能,就给我做三年长工好了。” 阿卑多想了一想,说:“我可以只拿1/10就办到,不过如果我办到了,你就得分一半金币给我。” 1/10?小巴依心想,你准备给我当长工好了。 于是阿卑多开始取金币…… 自然,阿卑多出色的完成了任务,得到了30枚金币,同样的,他把这些金币都分给了穷人们。 给你的任务就不同了。

 

Input
一个数n(1<=n<=1000) 表示金币枚数(金币上的数分别为1到n)

 

Output
两个数,阿卑多最少要拿的金币数以及不同的方案数。

 

Sample Input

 

6

 

Sample Output

 

3 2

 

解析:

题意很好理解,只要能想到任何数都可以用2的幂次方的和来表示,第一个数据输出并不难;问题就在第二个数据,由于这里要反复测试数据,那就会用到递归,具体见代码:

 

# include<stdio.h>
# include<string.h>
int num,cnt,add,k,leap;
int sign[15];
int min(int a,int b)
{
    return a<b?a:b;
}
void solve(int x)
{
    int i,st,en;
    for(i=add+1;i>=sign[x-1]+1;i--)//为了不出现(1,2,3,8)情况,i最大为i=(add=1+2+3)+1=7,往下减,直到上个数加一,
      {                            //即i>=sign[x-1]+1=3+1=4;这样就保证了,每种方案都可行
        sign[x]=i;                 //记录最后加的数
        add+=i;                    //将选的数加起来
        if(x<k)
            solve(x+1);            //先从最大开始
        else
        {
            add-=i;              //由于这里add要换着加数,所以要减去,重加一个,即换(1,2,4,8)中的8
            st=add+1;
            en=sign[x-1]+1;
            if(add+st>=num)                 //满足条件的
            cnt+=min(st-en+1,st-(num-add)+1);
            else leap=1;
            break;
        }
        if(leap)
        {
            leap=0;
            break;
        }
    }
    add-=sign[x-1];                //由于这里add要换着加数,所以要减去,重加一个,即换(1,2,4,8)中的4
}
int main()
{
    int lop,sum;
    scanf("%d",&num);
    add=0;
    k=1;
    lop=1;
    sum=1;
    cnt=0;
    while(sum<num)
    {
        lop*=2;
        sum+=lop;
        k++;
    }
    memset(sign,0,sizeof(sign));
    leap=0;
    solve(1);
    printf("%d %d\n",k,cnt);
    return 0;
}

 

 

 

posted on 2013-02-25 22:37  即为将军  阅读(368)  评论(0)    收藏  举报

导航