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
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
- Fish的烦恼
- 不受欢迎的cold fish
- Fish
- fish
- Salty Fish---DP的变形
- 复制的 FISH 的文章 很好 顶
- 我的烦恼---来自studio2005的烦恼
- Fish Li 的一年博客总结
- fish shell的环境变量PATH设置
- fish shell的环境变量PATH设置
- 成长的烦恼归来
- 《成长的烦恼》介绍
- 信息多的烦恼
- eclipse的烦恼!
- 最近的烦恼
- 翻译的烦恼
- 刷新DBGrid的烦恼
- 了却最后的烦恼
- c++架构
- hdoj Watch The Movie 3496 (二维01背包)好题
- jQuery学习--添加元素
- Could not open ServletContext resource报错解决方法
- Android 通知栏Notification的整合 全面学习 (一个DEMO让你完全了解它)
- Fish的烦恼
- 3390: [Usaco2004 Dec]Bad Cowtractors牛的报复 最大生成树
- 设计模式感触之代理模式应用
- leetcode总结4 -- 关于two pointers两个容易考的题目
- 华为机试题目
- 包
- 插入usb之后发生了什么
- Swift笔记(一)
- C# 正则表达式