聪明的阿卑多
聪明的阿卑多
| Time Limit: 1000MS | Memory Limit: 65535KB |
| Submissions: 4 | Accepted: 1 |
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; }
浙公网安备 33010602011771号