[Swust OJ 179]--火柴棍(找规律)

 

题目链接:http://acm.swust.edu.cn/problem/0179/

 

Time limit(ms): 1000      Memory limit(kb): 65535
 
Description

火柴棍可以拼成10进制的数字,如图所示:

 


现在,gogo给你个n个火柴棍,要求你输出最小能拼成的数字和最大能拼成的数字。

 
Input

第一行输入一个整数T:T组测试数据(T<100)

每行输入一个n (2 ≤ n ≤ 100): 表示你有的火柴棍数。

 

Output

最小能拼成的数字和最大能拼成的数字, 用一个空格分开. 没有前导0.

 
 
Sample Input
4
3
6
7
15
Sample Output
7 7
6 111
8 711
108 7111111

 
 

 

解题思路:最大值就是凑成7或1,偶数根全为1,奇数根火柴拼一个7,至于最小值,我是找的规律前17根火柴直接找出来的(如下表)

     发现18根火柴得到最小208,19根288,20根688,满足x[i]=x[i-7]*10+8,提交了一下果然过了Orz~~~

0 1  2  3  4  5  6  7   8   9 10 11 12 13 14 15 16 17
 0  0  1  7  4  2  6  8 10 18 22 20 28 68 88 108 188 200

 

代码如下:

 1 #include <iostream>

 2 using namespace std;

 3 long long a[105] = { 0, 0, 1, 7, 4, 2, 6, 8, 10, 18, 22, 20, 28, 68, 88, 108, 188, 200 };

 4 void init(){

 5     for (int i = 18; i <= 105; ++i){

 6         a[i] = a[i - 7] * 10 + 8;

 7     }

 8 }

 9 int main(){

10     int t, n;

11     cin >> t;

12     init();//没有加这一句,将答案算出,贡献一次wa

13     while (t--)

14     {

15         cin >> n;

16         cout << a[n] << ' ';

17         while (n){

18             if (n & 1){

19                 cout << 7;

20                 n -= 3;

21             }

22             else{

23                 cout << 1;

24                 n -= 2;

25             }

26         }

27         cout << endl;

28     }

29     return 0;

30 }
View Code

 

你可能感兴趣的:(OJ)