讨论 / 都快成Cheat王了……
飞雪天涯 2009-09-18 06:38:00
点我顶贴 收藏 删除
查看状态 Show Status

状态题目:小明学算术

题目编号: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;

}

#1 webeskycn@2009-09-13 09:01:00
回复 删除
= =

这程序也发。。。

orz

#2 飞雪天涯@2009-09-18 06:38:00
回复 删除
orz!

Orz!

囧rz!

崮rz!

查看更多回复
提交回复