Fish的烦恼

来源:互联网 发布:seo标题和关键字 编辑:程序博客网 时间:2024/04/30 21:23

Fish是一条生活在海里的鱼,有一天他很无聊,于是他去捡了人类扔进海里的垃圾,打算用这些来玩些什么。

他从捡回来的垃圾堆里找到了n根火柴棍,他想把这些火柴棍拼成一个长度为m的十进制数,每个数字的拼法如下图所示。


他想拼出来的数尽量大,这该怎么拼呢?

聪明的你,肯定知道该如何利用这n根木棒得到最大的m位数。

那就快告诉Fish吧~

当然,不能有前导0哦。

而且木棍得全部用完!

Input

第一行输入两个整数,n,m

满足 1<=n,m<=105

Output

将这m位数输出

如果不能得到任何一个m位数,请输出1

Sample input and output

Sample InputSample Output
5 2
71
1 1000
-1

 

 

#include "stdafx.h"#include "stdio.h"#include <math.h>int stick[10] = {0, 2, 0, 0, 4, 5, 0, 3, 7, 6};int Table[10] = {0, 0, 1, 7, 4, 5, 9, 8};int Result[100] = {0};int func(int n, int m){if (1 == m){if (n >= 2 && n <= 7){Result[m-1] = Table[n];return 0;}else{return -1;}}else if(m >= 2 && n >= 2*m && n <= 7 * m){for (int k = 9; k >= 0; k--){if (stick[k] <= 0){continue;}if (0 == func(n - stick[k], m-1)){Result[m-1] = k;return 0;}}}}int _tmain(int argc, _TCHAR* argv[]){int m = 0, n = 0;int data = 0;printf_s("Please input two numbers :\n");scanf_s("%d, %d", &n, &m);if (func(n, m) == 0){for (int i = 0; i < m; i++){data += Result[i] * pow(10.0, i);}printf("The result is %d!\n", data);}else{printf("The input numbers are invalid!\n");}return 0;}

第一次参加编程大赛,留文纪念.

2016.1.12

很明显,当我拿去递交的时候,发现有错误,这个错误促使我去发现,至少有几处:

1.题目的要求是0<n,m< 10^5,显然过不了极限测试

2.当m,n非常大的时候,data不可能满足要求,所以数组表示就可以了

3.当m超过5000次的时候,递归不能开销了。于是我思索更好的方法。

4.要严格按照题目的要求来定输入输出格式

 下面是我的第2个版本,

因为要求是输出最大的十进制数,显然,首位越大越好,而且,我提出了一个假设,就是只要2*m <= n<= 7*m,总是能够拼出来的。


#include "stdio.h"#include <math.h>int stick[10] = {0, 2, 0, 0, 4, 5, 0, 3, 7, 6};int Table[10] = {0, 0, 1, 7, 4, 5, 9, 8};int Result[100005] = {0};int func(int n, int m){int i = 0;int k = 9;int m_loop = m;//check invalid if (m < 1 || n < 2*m || n > 7*m){return -1;}if (n == 2*m || n == 7*m){for (i = 0; i < m; ++i){Result[i] = Table[n/m];}return 0;}for (i = 0; i < m_loop; ++i){for (k = 9; k >= 0; --k){if (stick[k] <= 0){continue;}else{if ((n - stick[k]) >= 2*(m-1) && (n - stick[k]) <= 7*(m-1)){Result[i] = k;n = n - stick[k];m = m -1;break;}}}}return 0;}int main(int argc, char* argv[]){int m = 0, n = 0;int i = 0;scanf("%d %d", &n, &m);if (n > 100000 || m > 100000){printf("-1\n");return 0;}if (func(n, m) == 0){for (i = 0; i < m; i++){      printf("%d", Result[i]);}printf("\n");return 0;}else{
               printf(" -1!\n");return 0;}}



0 0
原创粉丝点击