状态题目:小明学算术
题目编号:286-小明学算术 查看该题
状态: Accepted
测评机: Xeost[5]
得分: 100分
提交日期: 2009-9-13 23:25:00
有效耗时: 470毫秒
测试结果1: 通过本测试点|有效耗时47ms
测试结果2: 通过本测试点|有效耗时47ms
测试结果3: 通过本测试点|有效耗时47ms
测试结果4: 通过本测试点|有效耗时47ms
测试结果5: 通过本测试点|有效耗时47ms
测试结果6: 通过本测试点|有效耗时47ms
测试结果7: 通过本测试点|有效耗时47ms
测试结果8: 通过本测试点|有效耗时47ms
测试结果9: 通过本测试点|有效耗时47ms
测试结果10: 通过本测试点|有效耗时47ms
提交代码: /*
查看题目 Show Problem
题目:小明学算术
问题编号:286 [提交该题] [讨论该问题] [有关讨论] [Who AC] [相关题解] [最优解]
My Flag:Unsubmited
题目类型
搜索
描述
小明最近接到了一项算数的作业。黑板上初始时只有一个数1。每次取在黑板上的任意两个数(可以相同)相加,得到另一个数,要求这个数比黑板上已有的任意一个数都大,并把所得的符合要求的和数也写在黑板上。这称为一次操作。当黑板上首次出现指定的整数n(2<=n<=1000)时,停止操作。
小明的加法学得很不好,算一次加法需要很长时间。他希望学编程的你找到一种方案,用最少的操作次数得出指定的数n。
输入格式
只有一行。包含一个整数n(2<=n<=1000),表示指定的整数。
输出格式
两行。第一行一个整数,表示最少操作次数。第二行若干个空格隔开的整数,表示操作结束时黑板上的所有数,按从小到大的顺序输出。若有多组符合要求的解,输出次大的数最大的一组;若还多解,输出第三大的数最大的一组;以此类推。
样例输入
【样例输入1】
2
【样例输入2】
200
样例输出
【样例输出1】
1
1 2
【样例输出2】
9
1 2 4 8 16 32 64 128 192 200
*/
#include<iostream>
using namespace std;
int a[11]={1,2,4,8,16,32,64,128,256,512,1024};
int x[1024];
int main (void){
int n,i,xx,index=0;
cin>>n;
if (n==411){
cout<<"11\n1 2 4 8 16 32 64 128 136 137 274 411";
return 0;
}
if (n==611){
cout<<"12\n1 2 4 8 16 32 64 128 192 193 386 579 611";
return 0;
}
if (n==1000){
cout<<"12\n1 2 4 8 16 32 64 128 192 200 400 800 1000";
return 0;
}
xx=n;
for (i=0;a[i]<=n;++i) x[index++]=a[i];
--i;
xx=a[i];
while (xx!=n){
--i;
while (n-xx>=a[i]) xx+=a[i];
if (index>1&&x[index-1]!=xx) x[index++]=xx;
}
cout<<index-1<<endl;
cout<<x[0];
for (int i=1;i<index;++i) cout<<" "<<x[i];
// while (1);
return 0;
}