牛牛给了小度n根火柴和m种数字(m只能是1到9),小度只能摆这m种数字,小度想知道能摆出来最大的数的多少。 如图所示: 摆数字1,2,3,4,5,6,7,8,9 分别需要花费 2,5,5,4,5,6,3,7,6根火柴。-笔试面试资料

这是qklbishe.com第16471 篇笔试面试资料
提供答案分析,通过本文《牛牛给了小度n根火柴和m种数字(m只能是1到9),小度只能摆这m种数字,小度想知道能摆出来最大的数的多少。

如图所示: 摆数字1,2,3,4,5,6,7,8,9 分别需要花费 2,5,5,4,5,6,3,7,6根火柴。-笔试面试资料》可以理解其中的代码原理,这是一篇很好的求职学习资料
本站提供程序员计算机面试经验学习,笔试经验,包括字节跳动/头条,腾讯,阿里,美团,滴滴出行,网易,百度,京东,小米,华为,微软等互联网大厂真题学习背诵。

答案:
牛牛给了小度n根火柴和m种数字(m只能是1到9),小度只能摆这m种数字,小度想知道能摆出来最大的数的多少。
牛牛给了小度n根火柴和m种数字(m只能是1到9),小度只能摆这m种数字,小度想知道能摆出来最大的数的多少。      如图所示: 摆数字1,2,3,4,5,6,7,8,9 分别需要花费 2,5,5,4,5,6,3,7,6根火柴。
如图所示: 摆数字1,2,3,4,5,6,7,8,9 分别需要花费 2,5,5,4,5,6,3,7,6根火柴。

牛牛给了小度n根火柴和m种数字(m只能是1到9),小度只能摆这m种数字,小度想知道能摆出来最大的数的多少。      如图所示: 摆数字1,2,3,4,5,6,7,8,9 分别需要花费 2,5,5,4,5,6,3,7,6根火柴。 区块链毕设学生843191783号
个人思路解析:
1、用map存对应关系<火柴数,对应数字>,如果存在同样火柴数,但是更大数字的就修改map,map的key值有序
2、用数组存火柴数和数字(map不支持随机访问,map有序,所以转存数组根据火柴数大小升序)
3、已知,用最少的火柴数能摆放更多个数字,自然更大,因此计算出如果全是最小火柴数数字(个数cnt)后,剩余的火柴数d,然后减少个数,增加d值,看是否能支持摆出数字组合,如果可以,结果就是cnt个最小火柴数对应数字以及后面的数字组合合起来组成的数字。
4、对数字按照大小进行排序,就能得到最大的数字。
#include <iostream> #include <vector> #include <set> #include <map> #include <string> #include <algorithm> using namespace std; set<string> ret; vector<int> nn, ch; void f(int num, string s) {     if (num < 0) { return; }     if (num == 0) { ret.insert(s); return; }     for (int i = 0; i <nn.size(); i++) {         f(num - nn[i], s + to_string(ch[i]));     } } bool cmp(string a, string b) {     if (a.size() == b.size()) { return a < b; }     else return a.size() < b.size(); } bool chcmp(char a, char b) {     return a > b; } int main() {     int n, m, a;     cin >> n >> m;     int num[10] = { 0,2,5,5,4,5,6,3,7,6 };     vector<int> ve;     map<int, int> ma;     for (int i = 0; i < m; i++) {         cin >> a;         if (ma.find(num[a]) == ma.end()) { ma[num[a]] = a; }         else {             if (a > ma[num[a]]) { ma[num[a]] = a; }         }     }     for (auto it : ma) {         nn.push_back(it.first);         ch.push_back(it.second);     }     ma.clear();     int d = n % nn[0], cnt = n / nn[0];     while (ret.size() == 0) {         string s;         d = d + nn[0]; cnt--;         f(d, s);//找出d根火柴在限定可能性的情况下是否能刚好摆出数字。     }     vector<string> ss(ret.size());     int i = 0;     for (auto it : ret) { ss[i++] = it; }     sort(ss.begin(), ss.end(), cmp);     string s = ss[ret.size() - 1];//找出ss中长度最长、数字最大的组合。     while (cnt--) { s = s + to_string(ch[0]); }     sort(s.begin(), s.end(),chcmp);//对数字进行排序     cout << s << endl;     return 0; }

今天 17:05:51 回复(0)

文章部分来自互联网,侵权联系删除
www.qklbishe.com

区块链毕设网(www.qklbishe.com)全网最靠谱的原创区块链毕设代做网站
部分资料来自网络,侵权联系删除!
资源收费仅为搬运整理打赏费用,用户自愿支付 !
qklbishe.com区块链毕设代做网专注|以太坊fabric-计算机|java|毕业设计|代做平台 » 牛牛给了小度n根火柴和m种数字(m只能是1到9),小度只能摆这m种数字,小度想知道能摆出来最大的数的多少。 如图所示: 摆数字1,2,3,4,5,6,7,8,9 分别需要花费 2,5,5,4,5,6,3,7,6根火柴。-笔试面试资料

提供最优质的资源集合

立即查看 了解详情