2020安徽省大学生程序设计大赛题解——A数字排列
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数字排列相关推荐
- 2020安徽省大学生程序设计大赛题解——E 收集圣物
2020安徽省大学生程序设计大赛题解--E 收集圣物 E 收集圣物 在一个策略游戏中,僧侣单位可以收集圣物,放入修道院中,以生产黄金.因此,圣物对赢得游戏的胜利很重要. 某个僧侣正处于一个长为n 宽为 ...
- 2020安徽省大学生程序设计大赛题解——K 农夫打狼
2020安徽省大学生程序设计大赛题解--K 农夫打狼 K 农夫打狼 题解 标签 排序,动态规划 分析 图K−1本题的一个样例,彩色十字为起点和终点图K-1 \ \ \ \ 本题的一个样例,彩色十字为起 ...
- 2020安徽省大学生程序设计大赛题解——F 跳蛙出行
2020安徽省大学生程序设计大赛题解--F 跳蛙出行 F 跳蛙出行 池塘里有n片荷叶排成一行,有一只青蛙在上面跳跃.但是,这只青蛙是只不同寻常的青蛙,它每跳一次,只能从一片荷叶跳到相邻的荷叶上,并且, ...
- 2020安徽省大学生程序设计大赛题解——J 飞奔的战士
2020安徽省大学生程序设计大赛题解--J 飞奔的战士 J 飞奔的战士 题目 众所周知, T e u t o n i c K n i g h t Teutonic Knight TeutonicKni ...
- “Shopee杯” e起来编程暨武汉大学2020年大学生程序设计大赛决赛(重现赛)
比赛链接 文章目录 A题 A Simple Problem about election 题目描述 题解: 代码: D题 Deploy the medical team 题意: 题解: 代码: F题 ...
- 2017年“华信智原杯”安徽省大学生程序设计大赛C题-刷票
C. 刷票 题目描述: 有一个选秀比赛,节目组按照观众的投票情况决定选手的去留.为了给旗下 艺人造势,A 公司收买了一批水军来刷票.已知现在有 n 名选手同台竞争,依次 编号 1-n,A 公司的艺人编 ...
- 2022年安徽省机器人大赛——程序设计赛道 第十三届安徽省大学生程序设计大赛————I 玩捉迷藏
(建议直接观看后面图片,图片更生动哦) 首先看这个题目,这个题目也是比较简单得,最主要就是读懂这个题目,因为我感觉这个题目还是比较绕人的. 首先我们来分析一下题目,"小明可以使用 Cij个航 ...
- 2020 乐山师范学院新生程序设计大赛题解
2020 乐山师范学院新生程序设计大赛题解 A 数组求和 中等难度 题目大意: 给定一个数组,执行若干次操作,每次操作可以把两个相邻的数变成相反数,求数组最大的和. 解题思路: 这其实是一个思维题,认 ...
- 金莹江苏省计算机学会教授,2020年江苏省大学生程序设计大赛在我校举办
11月15日,2020年江苏省程序设计大赛在河海大学举办.河海大学副校长董增川教授.江苏省计算机学会秘书长金莹教授出席闭幕式并致辞. 河海大学副校长董增川教授在致辞中表示,河海大学不断深化教育教学改革 ...
最新文章
- 别在用U盘拷贝源码带回家了,有童鞋被判刑啦!
- Warm Up before Exercise
- Lesson 02:变量、数据类型
- SQL Server 2008 复习(三)
- 很多程序员都在抱怨加班多,觉得该做的都做了,别人没做的,自己都做了。为什么?为什么别人能拿到几万的工资,自己只能拿到零头呢?
- 我用Python玩小游戏“跳一跳”,瞬间称霸了朋友圈!
- python乘法函数_Python中列表与元组的乘法操作示例
- C#操作IIS完整解析
- 66. 编写高效的 JavaScript
- adb工具包的安装和使用方法
- 安卓桌面软件_抖猫视频桌面下载-抖猫视频桌面官网版v4.0.8
- SQL注入环境搭建及多种注入类型测试实验
- 苦难是人生中必须经历的一课
- 手撸springmvc乞丐版
- 使用JavaScript克隆元素
- 速卖通电脑办公行业什么产品好卖?解读2022速卖通重点招商品类及营销策略
- 在 Ubuntu 中安装 DOSBox 玩老游戏
- h5互动小游戏定制开发流程
- boss直聘实现自动回复以及自动获取简历功能
- python基本类型介绍