[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

 

posted @ 2015-06-16 22:01  繁夜  阅读(864)  评论(0编辑  收藏  举报