[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 }
如果这是你所爱的,就不要让自己后悔~~~