2020安徽省大学生程序设计大赛题解——A数字排列

A 数字排列

给出两个整数A 和 B,可以重新排列A 得到新的数字C(不能有前导0)。求在小于等于B的情况下,C的最大值是多少。如果不存在输出-1。

题目:

标签

签到题

分析

本题并没有考察复杂的算法,为了体现编程语言广博精深的特点,我们用两种方法讨论本题,并讨论两种方法的利弊。

方法一:链表法

所谓链表法,一般在快速修改序列元素会用上。这里之所以采用链表结构,是为了快速的取到满足题目要求的排列结果。

我们分析的对象,是所给序列 A A A能够表示的最大的数形成的序列中,较高位的数(即数字较大者),和目标序列 B B B的较高位的数。如果满足要求,那么我们选出的数一定是最优策略该位所存放的数。如果不满足要求,那么我们继续找次高位的数,以此类推,直至完成整个目标序列的搜索。

这个方法的时间复杂度较小(具体数值与实验数据相关),但代码结构较为冗长,且空间复杂度较大。我们可以牺牲时间换取空间,用另一种方法完成此题。

我们随意挑选了一组数据 489153515 535175629 489153515 \ \ 535175629 489153515  535175629,方法一对时间复杂度的评估结果如下图所示,使用了约 0.9 m s 0.9ms 0.9ms。


图 A − 1 方 法 一 的 时 间 复 杂 度 评 估 图A-1 \ \ \ \ 方法一的时间复杂度评估 图A−1    方法一的时间复杂度评估

方法二:全排序法

全排序法非常容易理解,即对于已有序列 A A A,我们比较序列 A A A的所有可能组成的数,和序列 B B B组成的数的大小。这种方法无论是从思维上还是编写上,都很易于被接受。

当然,全排序不需要我们自行编写相关函数, C + + C++ C++算法库中有全排列函数 p r e v _ p e r m u t a t i o n prev\_permutation prev_permutation来帮我们求出序列的所有排列情况。

时间复杂度评估环节,我们用与方法一相同的测试数据,所得结果如下,使用了约 15.0 m s 15.0ms 15.0ms,是方法一所需时间的 16 16 16倍。


图 A − 2 方 法 二 的 时 间 复 杂 度 评 估 图A-2 \ \ \ \ 方法二的时间复杂度评估 图A−2    方法二的时间复杂度评估

以下两种参考答案,我们添加了时间复杂度测试功能代码,方便比较这两种算法针对不同数据集的优劣。一般来说,方法一的时间开销要小于方法二。

参考答案(方法一,C++)

#include<bits/stdc++.h>
#include <windows.h>
using namespace std;list<int> l;LARGE_INTEGER BegainTime;
LARGE_INTEGER EndTime;
LARGE_INTEGER Frequency;inline void printlist(list<int> l) {list<int>::iterator it = l.begin();while (it != l.end()){cout << *it;it++;}
}int M() {string s;cin >> s;for (char i : s)l.push_back(i - '0');l.sort();l.reverse();cin >> s;QueryPerformanceFrequency(&Frequency);QueryPerformanceCounter(&BegainTime);if (s.length() > l.size())printlist(l);else if (s.length() < l.size())cout << -1;else {for (int i = 0; i < s.length(); i++) {bool equ = true;bool flag = false;for (list<int>::iterator it = l.begin(); it != l.end(); it++) {if (i == 0 && *it == 0) {cout << -1;return 0;}if (*it == s[i] - '0') {cout << *it;l.erase(it);flag = true;break;}else if (*it < s[i] - '0') {cout << *it;l.erase(it);equ = false;flag = true;break;}}if (!flag) {cout << -1;return 0;}if (!equ) {printlist(l);return 0;}}}
}int main() {M();QueryPerformanceCounter(&EndTime);   cout << "\n运行时间(单位:s):" << (double)(EndTime.QuadPart - BegainTime.QuadPart) / Frequency.QuadPart << endl;}

参考答案(方法二,C++)

#include<bits/stdc++.h>
#include<Windows.h>
using namespace std;list<int> l;LARGE_INTEGER BegainTime;
LARGE_INTEGER EndTime;
LARGE_INTEGER Frequency;bool cmp(int a, int b) {return a > b;
}int num(int* a,int len) {int sum = 0;for (int i = 0; i < len; i++) {sum = sum * 10 + a[i];}return sum;
}int M() {string s;cin >> s;int* a = new int[s.length()];int lena = s.length();for (int i = 0; i < s.length(); i++)a[i] = s[i] - '0';sort(a, a + lena, cmp);cin >> s;int* b = new int[s.length()];for (int i = 0; i < s.length(); i++)b[i] = s[i] - '0';int lenb = s.length();QueryPerformanceFrequency(&Frequency);QueryPerformanceCounter(&BegainTime);do{if (a[0] == 0) break;if (num(a, lena) <= num(b, lenb)) {for (int i = 0; i < lena; i++)cout << a[i];return 0;}} while (prev_permutation(a, a + lena));cout << -1;return 0;
}int main() {M();QueryPerformanceCounter(&EndTime);cout << "\n运行时间(单位:s):" << (double)(EndTime.QuadPart - BegainTime.QuadPart) / Frequency.QuadPart << endl;
}

2020安徽省大学生程序设计大赛题解——A数字排列相关推荐

  1. 2020安徽省大学生程序设计大赛题解——E 收集圣物

    2020安徽省大学生程序设计大赛题解--E 收集圣物 E 收集圣物 在一个策略游戏中,僧侣单位可以收集圣物,放入修道院中,以生产黄金.因此,圣物对赢得游戏的胜利很重要. 某个僧侣正处于一个长为n 宽为 ...

  2. 2020安徽省大学生程序设计大赛题解——K 农夫打狼

    2020安徽省大学生程序设计大赛题解--K 农夫打狼 K 农夫打狼 题解 标签 排序,动态规划 分析 图K−1本题的一个样例,彩色十字为起点和终点图K-1 \ \ \ \ 本题的一个样例,彩色十字为起 ...

  3. 2020安徽省大学生程序设计大赛题解——F 跳蛙出行

    2020安徽省大学生程序设计大赛题解--F 跳蛙出行 F 跳蛙出行 池塘里有n片荷叶排成一行,有一只青蛙在上面跳跃.但是,这只青蛙是只不同寻常的青蛙,它每跳一次,只能从一片荷叶跳到相邻的荷叶上,并且, ...

  4. 2020安徽省大学生程序设计大赛题解——J 飞奔的战士

    2020安徽省大学生程序设计大赛题解--J 飞奔的战士 J 飞奔的战士 题目 众所周知, T e u t o n i c K n i g h t Teutonic Knight TeutonicKni ...

  5. “Shopee杯” e起来编程暨武汉大学2020年大学生程序设计大赛决赛(重现赛)

    比赛链接 文章目录 A题 A Simple Problem about election 题目描述 题解: 代码: D题 Deploy the medical team 题意: 题解: 代码: F题 ...

  6. 2017年“华信智原杯”安徽省大学生程序设计大赛C题-刷票

    C. 刷票 题目描述: 有一个选秀比赛,节目组按照观众的投票情况决定选手的去留.为了给旗下 艺人造势,A 公司收买了一批水军来刷票.已知现在有 n 名选手同台竞争,依次 编号 1-n,A 公司的艺人编 ...

  7. 2022年安徽省机器人大赛——程序设计赛道 第十三届安徽省大学生程序设计大赛————I 玩捉迷藏

    (建议直接观看后面图片,图片更生动哦) 首先看这个题目,这个题目也是比较简单得,最主要就是读懂这个题目,因为我感觉这个题目还是比较绕人的. 首先我们来分析一下题目,"小明可以使用 Cij个航 ...

  8. 2020 乐山师范学院新生程序设计大赛题解

    2020 乐山师范学院新生程序设计大赛题解 A 数组求和 中等难度 题目大意: 给定一个数组,执行若干次操作,每次操作可以把两个相邻的数变成相反数,求数组最大的和. 解题思路: 这其实是一个思维题,认 ...

  9. 金莹江苏省计算机学会教授,2020年江苏省大学生程序设计大赛在我校举办

    11月15日,2020年江苏省程序设计大赛在河海大学举办.河海大学副校长董增川教授.江苏省计算机学会秘书长金莹教授出席闭幕式并致辞. 河海大学副校长董增川教授在致辞中表示,河海大学不断深化教育教学改革 ...

最新文章

  1. 别在用U盘拷贝源码带回家了,有童鞋被判刑啦!
  2. Warm Up before Exercise
  3. Lesson 02:变量、数据类型
  4. SQL Server 2008 复习(三)
  5. 很多程序员都在抱怨加班多,觉得该做的都做了,别人没做的,自己都做了。为什么?为什么别人能拿到几万的工资,自己只能拿到零头呢?
  6. 我用Python玩小游戏“跳一跳”,瞬间称霸了朋友圈!
  7. python乘法函数_Python中列表与元组的乘法操作示例
  8. C#操作IIS完整解析
  9. 66. 编写高效的 JavaScript
  10. adb工具包的安装和使用方法
  11. 安卓桌面软件_抖猫视频桌面下载-抖猫视频桌面官网版v4.0.8
  12. SQL注入环境搭建及多种注入类型测试实验
  13. 苦难是人生中必须经历的一课
  14. 手撸springmvc乞丐版
  15. 使用JavaScript克隆元素
  16. 速卖通电脑办公行业什么产品好卖?解读2022速卖通重点招商品类及营销策略
  17. 在 Ubuntu 中安装 DOSBox 玩老游戏
  18. h5互动小游戏定制开发流程
  19. boss直聘实现自动回复以及自动获取简历功能
  20. python基本类型介绍

热门文章

  1. 百度搜索广告投放的展现位置!百度推广广告是如何扣费的?
  2. 修改host文件实现内网传输
  3. flutter Timer 延时器,定时器详解
  4. mysql数据库性能优化—my.cnf详解
  5. eclipse buid java 工程
  6. 如何修改默认的FTP帐号或密码
  7. 简述面向过程与面向过程的思想
  8. android 图片内存缓存文件在哪个文件夹,别再用手机管家清理内存了!1分钟删掉这些文件夹,内存多出几个G...
  9. 计算机应用基础小结,计算机应用基础教学小结
  10. 十进制转换成二进制——C语言