标签:
Fish是一条生活在海里的鱼,有一天他很无聊,于是他去捡了人类扔进海里的垃圾,打算用这些来玩些什么。
他从捡回来的垃圾堆里找到了n根火柴棍,他想把这些火柴棍拼成一个长度为m的十进制数,每个数字的拼法如下图所示。
他想拼出来的数尽量大,这该怎么拼呢?
聪明的你,肯定知道该如何利用这n根木棒得到最大的m位数。
那就快告诉Fish吧~
当然,不能有前导0哦。
而且木棍得全部用完!
第一行输入两个整数,n,m
满足 1<=n,m<=105
将这m位数输出
如果不能得到任何一个m位数,请输出−1
Sample Input | Sample Output |
---|---|
5 2 |
71 |
1 1000 |
-1 |
第一个样例解释:
一开始,Fish有5个木棒,Fish用了3根木棒摆成了7的模样,用2根木棍摆成了1的模样
合在一起,组成了 71 这个数!
Fish想了想,这的确是它恰好用完5根木棍后,能够组成的最大的数。
if (n < 2*m || n > 7*m) printf("-1\n");
int t[10] = { 6, 2, 5, 5, 4, 5, 6, 3, 7, 6 // 0 1 2 3 4 5 6 7 8 9 }; int tu[10] = { -1,-1, 1, 7, 4, 5, 9, 8,-1,-1 // 0 1 2 3 4 5 6 7 8 9 };
#include <cstdio> int t[10] = { 6, 2, 5, 5, 4, 5, 6, 3, 7, 6 // 0 1 2 3 4 5 6 7 8 9 }; int tu[10] = { -1,-1, 1, 7, 4, 5, 9, 8,-1,-1 // 0 1 2 3 4 5 6 7 8 9 }; int ans[100005]; int cur; int rest; int main() { int n, m; scanf("%d%d", &n, &m); rest = n; if (n < 2*m || n > 7*m) printf("-1\n"); else { for (cur = 0; cur < m; cur++) { for (int i = 9; i >= 0; i--) { if (t[i] <= rest) { ans[cur] = i; rest -= t[i]; break; } } if (rest < 2) break; } cur -= (cur == m); int r = cur; for (int rev = m-1; rev > cur; rev--) { while (ans[r] == 1) r--; if (rest >= 2) { ans[rev] = 1; rest -= t[1]; } else { rest += t[ans[r]] - t[1]; ans[r--] = 1; rev++; } } for (int i = 0; i < m && rest; i++) { for (int j = 9; j >= 0; j--) { if (j > ans[i] && t[j] - t[ans[i]] <= rest) { rest -= t[j] - t[ans[i]]; ans[i] = j; break; } } } for (int k = m-1; k >= 0 && rest; ) { if (tu[t[ans[k]]+1] != -1) { ans[k] = tu[t[ans[k]]+1]; rest--; } else { k--; } } for (int i = 0; i < m; i++) { printf("%d", ans[i]); } printf("\n"); } return 0; }
标签:
原文地址:http://www.cnblogs.com/cfeitong/p/5052532.html